如何利用golang运用mysql数据库


Posted in Golang onMarch 13, 2022

1.依赖包

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

如果忘记导入mysql依赖包会打不开mysql

如何利用golang运用mysql数据库

2.main.go

package main

import (
    _ "container_cloud/pkg/config"
    "container_cloud/pkg/utils/httputil"
    "container_cloud/routers"
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "net/http"
    "time"
)

func init() {
    httputil.InitHttpTool()
}

// mysql
const (
    USERNAME = "root"
    PASSWORD = "Admin123"
    NETWORK  = "tcp"
    // TODO  本地调试时放开
    /*SERVER   = "192.168.103.48"
    PORT     = 43306*/

    // TODO 部署到环境时放开
    SERVER   = "192.168.66.4"
    PORT     = 3306
    DATABASE = "container_cloud"
)

func main() {
    var err error
    dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s?parseTime=1&multiStatements=1&charset=utf8mb4&collation=utf8mb4_unicode_ci", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)

    db, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Printf("Open mysql failed,err:%v\n", err)
        return
    }
    //最大连接周期,超过时间的连接就close
    db.SetConnMaxLifetime(100 * time.Second)
    //设置最大连接数
    db.SetMaxOpenConns(100)
    //设置闲置连接数
    db.SetMaxIdleConns(16)

    defer db.Close()

    container := routers.InitApiRouter(db)
    server := &http.Server{Addr: ":8090", Handler: container}
    server.ListenAndServe()
}

如何利用golang运用mysql数据库

数据库的一些设置

3.db对象注入ApiRouter

如何利用golang运用mysql数据库

需要用到数据库的模块需要传递db对象

4.register层将db传给controller

package v1alpha1

import (
    "container_cloud/pkg/api"
    "container_cloud/pkg/apiserver/query"
    "container_cloud/pkg/apiserver/runtime"
    "container_cloud/pkg/controller"
    "container_cloud/pkg/domain"
    "database/sql"
    "github.com/emicklei/go-restful"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "net/http"
)

const (
    GroupName = "order.ictnj.io"
    Version   = "v1alpha1"
)

var GroupVersion = schema.GroupVersion{Group: GroupName, Version: Version}

func AddToContainer(db *sql.DB) *restful.WebService{
    ws := runtime.NewWebService(GroupVersion)
    orderController := controller.NewOrderController(db)

    // 创建订单接口,pvc创建、负载创建的时候,是在特定命名空间下。(其实请求入参中也有命名空间字段,资源创建的时候也可以从入参中获取)
    ws.Route(ws.POST("/namespaces/{namespace}/orders").
        To(orderController.CreateOrder).
        Param(ws.PathParameter("namespace", "namespace name")).
        Returns(http.StatusOK, api.StatusOK, map[string]string{}).
        Doc("create order."))

    return ws
}

5.controller层将db传给service或者mapper

type orderController struct {
    Db *sql.DB
}

func NewOrderController(db *sql.DB) *orderController{
    return &orderController{Db: db}
}

// 再创建订单
    orderService := service.NewOrderService(o.Db)
    orderService.CreateOrder(order)
    result := map[string]string{"message": "success"}
    response.WriteEntity(result)

如何利用golang运用mysql数据库

6.架构分析图

如何利用golang运用mysql数据库

当逻辑比较简单可以直接略过service,controller直接调用mapper

7.mapper示例

package service

import (
    "container_cloud/pkg/api"
    "container_cloud/pkg/apiserver/query"
    "container_cloud/pkg/domain"
    "database/sql"
    "encoding/json"
    "fmt"
    "github.com/google/uuid"
    "k8s.io/klog"
    "strings"
    "time"
)

type OrderService struct {
    Db *sql.DB
}

func NewOrderService(db *sql.DB) *OrderService{
    return &OrderService{Db: db}

}
func (o *OrderService) CreateOrder(order domain.Order) {
    order.CreateTime = time.Now()
    var orderType uint8 = 1
    order.OrderType = &orderType
    uuid,_ := uuid.NewRandom()
    order.Id = strings.ReplaceAll(uuid.String(), "-", "")

    jsonbyte, _ := json.Marshal(order.OrderItem)
    order.OrderItemJson = string(jsonbyte)

    o.insertData(order)
}

func (o *OrderService) insertData(order domain.Order) {
    stmt, _ := o.Db.Prepare(`INSERT INTO t_order (id, username, service_type, order_type, status, reason, order_item, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
    defer stmt.Close()

    ret, err := stmt.Exec(order.Id, order.Username, order.ServiceType, order.OrderType, order.Status, order.Reason, order.OrderItemJson, order.CreateTime)
    if err != nil {
        fmt.Printf("insert data error: %v\n", err)
        return
    }
    if LastInsertId, err := ret.LastInsertId(); nil == err {
        fmt.Println("LastInsertId:", LastInsertId)
    }
    if RowsAffected, err := ret.RowsAffected(); nil == err {
        fmt.Println("RowsAffected:", RowsAffected)
    }
}

func (o *OrderService) ListOrders(query *query.Query, username string) (*api.ListResult, error){
    // 查询总数量
    totalRow, err := o.Db.Query("SELECT COUNT(*) FROM t_order WHERE username = ?", username)
    if err != nil {
        klog.Error("query orders count error", err)
        return nil, err
    }
    total := 0
    for totalRow.Next() {
        err := totalRow.Scan(
            &total,
        )
        if err != nil {
            klog.Error("query orders count error", err)
            continue
        }
    }
    totalRow.Close()

    // 查询订单列表
    rows, err := o.Db.Query("select * from t_order where username = ? order by create_time desc limit ? offset ? ", username, query.Pagination.Limit, query.Pagination.Offset)
    defer func() {
        if rows != nil {
            rows.Close()
        }
    }()
    if err != nil {
        klog.Error("query orders error", err)
        return nil, err
    }

    items := make([]interface{}, 0)
    for rows.Next() {
        order := new(domain.Order)
        err = rows.Scan(&order.Id, &order.Username, &order.ServiceType, &order.OrderType, &order.Status, &order.Reason, &order.OrderItemJson, &order.CreateTime)
        if err != nil {
            klog.Error("query orders error", err)
            return nil, err
        }
        order.OrderItemJson = ""
        items = append(items, *order)
    }

    return &api.ListResult{
        TotalItems: total,
        Items:      items,
    }, nil

}

func (o *OrderService) GetOrder(id string) (*domain.Order, error) {
    order := new(domain.Order)
    row := o.Db.QueryRow("select order_item from t_order where id = ?", id)
    if err := row.Scan(&order.OrderItemJson); err != nil {
        klog.Error(err)
        return nil, err
    }
    orderItems := &[]domain.OrderItem{}
    json.Unmarshal([]byte(order.OrderItemJson), orderItems)

    order.OrderItemJson = ""
    order.OrderItem = *orderItems
    return order, nil
}


func (o *OrderService) ListUserOrders(username string) (*[]domain.Order, error){
    // 查询订单列表
    rows, err := o.Db.Query("select * from t_order where username = ? order by create_time desc", username)
    defer func() {
        if rows != nil {
            rows.Close()
        }
    }()
    if err != nil {
        klog.Error("query orders error", err)
        return nil, err
    }
    items :=  make([]domain.Order,0)
    for rows.Next() {
        order := new(domain.Order)
        err = rows.Scan(&order.Id, &order.Username, &order.ServiceType, &order.OrderType, &order.Status, &order.Reason, &order.OrderItemJson, &order.CreateTime)
        if err != nil {
            klog.Error("query orders error", err)
            return nil, err
        }
        order.OrderItemJson = ""
        items = append(items, *order)
    }

    return &items,nil
}

到此这篇关于如何利用golang运用mysql数据库的文章就介绍到这了,更多相关golang运用mysql数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
golang判断key是否在map中的代码
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
解决Go gorm踩过的坑
Apr 30 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
深入理解go缓存库freecache的使用
Feb 15 #Golang
Go语言读取txt文档的操作方法
Jan 22 #Golang
一文搞懂Golang 时间和日期相关函数
Go语言基础切片的创建及初始化示例详解
Nov 17 #Golang
Go语言基础map用法及示例详解
Nov 17 #Golang
Go语言基础函数基本用法及示例详解
Nov 17 #Golang
golang中的struct操作
Nov 11 #Golang
You might like
PHP4在Windows2000下的安装
2006/10/09 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
优纳科技软件测试面试题
2012/05/15 面试题
简单的大学生自我鉴定
2014/02/18 职场文书
中学生评语大全
2014/04/18 职场文书
公司演讲稿开场白
2014/08/25 职场文书
趣味运动会广播稿
2014/09/13 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android