跳到主要内容

简介

数据库推荐使用优秀的开源组件 GORM,GORM 项目启动于 2013 年,是目前非常流行的开源 ORM 框架。

添加 Mysql 支持

在模块级根目录执行如下命令

cvg enable mysql

以上命令会进行如下操作:

1.创建配置文件:

  • app/config/database.yaml
  • app/config/alpha/database.yaml
  • app/config/release/database.yaml

其中 app/config/database.yaml 为公共配置文件,多个模块公用,你可以在各模块的配置文件中单独覆盖部分配置项,详情参考 配置章节 。 生成的另外两个不同目录下的 database.yaml 没有实际作用,作为参考,在测试环境或生产环境可能需要修改的差异化配置项。

2.创建 app/entity 目录,用于存放多个模块公用的表实体定义。 3.在 app/instance.go 中添加全局数据库连接定义:

package app

import (
"gorm.io/gorm"
)

var Db *gorm.DB

4.在模块 internal/boot/init.go 中初始化连接池

import (
"cvgo/app"
"cvgo/app/entity"
"cvgo/provider/orm"
)

func init() {
database := provider.Services.NewSingle(orm.Name).(orm.Service)
app.Db = database.GetConnPool()
if !app.IsDevelop() {
entity.AutoMigrate(app.Db) // 生产环境自动迁移表结构
}
}

经过以上步骤,mysql 就介入到项目中了,你只需要执行一行命令,然后去修改改生成的配置文件,配置你的 msyql 服务器。

配置详解

database.yaml
###################### 通用配置 Regoin Start ######################

# debug 为 true 会在控制台打印出每条 sql 语句
debug: true

# 默认连接
default_conn: master

# 连接池最大空闲连接数
conn_max_idle: 10

# 连接池最大连接数
conn_max_open: 100

# 连接数最大生命周期
conn_max_lifetime: 1h

# 传输协议
protocol: tcp

# 时区
loc: Local

# 是否解析时间
parse_time: true

# 字符集
charset: utf8mb4

# 字符序
collation: utf8mb4_unicode_ci

# 连接超时
timeout: 10s

# 读超时
read_timeout: 2s

# 写超时
write_timeout: 2s

###################### 通用配置 Regoin End ######################

# 主库连接配置
master:
driver: mysql # 连接驱动,目前只支持 mysql
host: localhost # ip地址
port: 3306 # 端口
database: test # 数据库
username: user # 用户名
password: "123456" # 密码

# 从库连接配置
slave:
driver: mysql
host: localhost
port: 3306
database: test2
username: user
password: "123456"

上面的配置中,先是定义了一些通用配置(所有一级节点的配置都是通用配置),这些通用配置会被连接配置所继承,即后面的主从两个数据的配置都会继承通用配置。 你也可以在连接配置中覆盖通用配置项,例如:

slave:
driver: mysql
host: localhost
port: 3306
database: test2
username: user
password: abcdefg
# 覆盖通用配置
conn_max_idle: 10
conn_max_open: 100

获取连接

在模块 internal/boot/init.go 中通过 GetConnPool() 方法获取连接

import (
"cvgo/app"
"cvgo/app/entity"
"cvgo/provider/orm"
)

func init() {
database := provider.Services.NewSingle(orm.Name).(orm.Service)

// 获取连接,取的是 database.yaml 中 default_conn 配置项指定的配置名,默认为 master
// 所以上面这行等价于 app.Db = database.GetConnPool("master")
app.Db = database.GetConnPool()

// 如果你在 database.yaml 中配置有多个数据库,只需要传入配置名称
app.DbSlave = database.GetConnPool("slave")
}

操作数据库

在上一步中我们将数据库连池接保存在了 app/instance.go 的全局变量中,所以可以在任何地方通过全局变量获取连接

import (
"cvgo/app"
"fmt"
)

type Result struct {
Id int
Name string
}

func Test() {
var result Result
sql := "SELECT * FROM table WHERE name = ?"
app.Db.Raw(sql, "cvgo").Scan(&result)
fmt.Println(result)
}

更多的数据库操作请查看 GORM 官方文档

生成 entity

在模块目录下执行一下命令将模型定义生成到 entity/mysql 中,并将添加到自动迁移配置中:

// cvg add table 表名称 <表注释>
cvg create-table user 用户表

表名称建议使用 snake_case 风格,如:user_photos