如何利用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语言-在mac下brew升级golang
Apr 25 Golang
Golang 正则匹配效率详解
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
Go 自定义package包设置与导入操作
May 06 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang 遍历二叉树
Apr 19 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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
如何把PHP转成EXE文件
2006/10/09 PHP
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
Python实现的简单线性回归算法实例分析
2018/12/26 Python
python读写csv文件的方法
2019/08/13 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python线程指南分享
2019/11/19 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
鸿星尔克广告词
2014/03/21 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
项目战略合作意向书
2015/05/08 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
详细总结Python常见的安全问题
2021/05/21 Python