新建文件路径在:项目/rpc/etc/ 下
创建一个名称为 config.yml 的文件如下图所示:
「」使用这个符号包裹的信息全部需要用户填入你自己的信息
base:
is_dev: false
db_info:
host: 「sql地址」
port: 3306
username: 「账户」
password: 「密码」
database: 「数据库」
type: 0
out_dir: ../internal/model
url_tag: json
language: 中 文
db_tag: gorm
user_gorm_model: false
simple: false
is_web_tag: false
is_web_tag_pk_hidden: false
is_foreign_key: true
is_out_sql: false
is_out_func: true
is_gui: true
is_table_name: true
is_null_to_point: false
table_prefix: ""
self_type_define: {}
out_file_name: ""
web_tag_type: 0
table_names: 「表名」
is_column_name: false
is_out_file_by_table_name: false
is_out_page: false
2、安装软件:gormt
生成可以操作生成model的软件
go install github.com/xxjwxc/gormt@master3、生成model文件 3.1 进入config.yml的文件绝对路径
copy并进入刚才存入config.yml的文件绝对路径
cd /Users/ctra_wl/Desktop/simbaM/simbam-go-email/rpc/etc3.2 执行 gormt -g
执行
gormt -g
可见如下图所示
直接回车(或者鼠标点击“直接执行”)
处理 xxx_template.go 的文件
修改后会出现爆红,这里细节需要处理一下
处理 xxx_go.go 的文件
这个文件需要你和数据库重新核对一下
建议根据官方文档使用如下三个字段
创建时间、修改时间、逻辑删除
CreateAt time.Time `gorm:"autoCreateTime"` // 创建时间 UpdateAt time.Time `gorm:"autoUpdateTime"` DeletedAt gorm.DeletedAt `gorm:"column:is_del;type:datetime;default:null"`4、go 逆向生成sql数据库表
在svc文件中,我们加入一段如下代码
(在方法 func NewServiceContext(c config.Config) *ServiceContext 内加入)
db, err := gorm.Open(mysql.Open(c.Datasource), &gorm.Config{
NowFunc: func() time.Time {
return time.Now().Local()
}})
if err != nil {
logx.Error(err)
os.Exit(1)
}
d, err := db.DB()
if err != nil {
logx.Error(err)
os.Exit(1)
}
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
d.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
d.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
d.SetConnMaxLifetime(time.Hour)
_ = db.AutoMigrate(model.SysSite{})
_ = db.AutoMigrate(model.SysUser{})
核心语句:
_ = db.AutoMigrate(model.SysSite{})
_ = db.AutoMigrate(model.SysUser{})
这俩个model对应的就是 model中的生成sql表mapping的go的struct
我们直接将对应的数据库表删除
然后执行这个rpc项目即可看到数据库直接生成了我们需要的表
这里摘自官方文档的一张图说明主键创建的方式
best practice 如下:
ID int64 `gorm:"primaryKey;column:id;not null"`
通过反复重试,发现这里primaryKey包括了autoIncrement,而且又和 type 冲突
即使用了 type后autoIncrement自动失效
所以按照上面的方式去创建你得主键吧
go-zero中所有的rpc服务,会把数据库链接注册进svc中
然而我们需要在测试环境下开启sql日志打印,在生产下关闭
- 修改rpc-etc-xx.yaml 文件中加入:Mode: dev
- 在svc中添加代码即可
文件路径:/Users/ctra_wl/Desktop/simbaM/simbam-go-rbac/rpc/internal/svc/servicecontext.go
全部代码如下所示:
package svc
import (
"git-codecommit.xxx.amazonaws.com/xxxx/config"
"git-codecommit.xxx.amazonaws.com/xxxx/model"
"github.com/casbin/casbin/v2"
gormadapter "github.com/casbin/gorm-adapter/v3"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"os"
"time"
)
type ServiceContext struct {
Config config.Config
CasbinClient *casbin.Enforcer
SysMenu *model.SysMenuMgr
}
func NewServiceContext(c config.Config) *ServiceContext {
db, err := gorm.Open(mysql.Open(c.Datasource), &gorm.Config{
NowFunc: func() time.Time {
return time.Now().Local()
}})
if err != nil {
logx.Error(err)
os.Exit(1)
}
d, err := db.DB()
if err != nil {
logx.Error(err)
os.Exit(1)
}
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
d.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
d.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
d.SetConnMaxLifetime(time.Hour)
// 判断环境是否为生产,开启debug(打印sql)
if c.Mode != "pro" {
db = db.Debug()
}
return &ServiceContext{
Config: c,
CasbinClient: enforcer,
SysMenu: model.SysMenuMg(db),
}
}
核心代码,含义是如果为配置文件中Mod不为生产就开启 db.Debug() sql日志打印
if c.Mode != "pro" {
db = db.Debug()
}
查看go-zero源码可见,所以我们使用 pro 为生产mod
项目中 etc yaml配置如下:(默认开启的是dev测试)
最后附上 gorm的官方文档链接大家可以根据需要自行查询
https://gorm.io/docs/index.html



