如何利用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中semaphore(信号量)源码
Apr 03 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
GoFrame框架数据校验之校验结果Error接口对象
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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
Python文件去除注释的方法
2015/05/25 Python
pandas如何处理缺失值
2019/07/31 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
蓬莱阁导游词
2015/02/04 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
党支部综合考察意见
2015/06/01 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书