简介
数据库推荐使用优秀的开源组件 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