工具gen"/>
gorm的自动化工具gen
gorm的自动化工具gen
官方
/
假设数据库结构如
这里使用gen-tool
安装
go install gorm.io/gen/tools/gentool@latest
用法
gentool -hUsage of gentool:-c string配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 -db string指定Driver,默认值“mysql”,referer:.html-dsn string用于连接数据库的DSN reference: .html-fieldNullable当字段允许空时用指针生成-fieldWithIndexTag生成带有gorm index 标签的字段-fieldWithTypeTag生成带有gorm type标签的字段-modelPkgName string生成模型代码包名称。-outFile stringGenrated 查询代码文件名称,默认值:gen.go-outPath string指定输出目录(默认 “./dao/query”)-tables string指定要生成的表名称,默认所有表。-onlyModel指生成Models不生成对应的query-withUnitTest生成单元测试,默认值 false, 选项: false / true-fieldSignabledetect integer field's unsigned type, adjust generated data type
Example
gentool -dsn "user:pwd@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" -tables "orders,doctor"gentool -c "./gen.tool" # 配置文件像下面
version: "0.1"
database:# consult[.html]"dsn : "username:password@tcp(address:port)/db?charset=utf8mb4&parseTime=true&loc=Local"# 选择mysql或者其他引擎,比方sqlserverdb : "mysql"# 指定要生成的table,流控则全部tables : "user"# 指定输出目录outPath : "./dao/query"# 输出的代码,默认gen.gooutFile : ""# 是否生成单元测试withUnitTest : false# generated model code's package name# 生成的model的代码的包名modelPkgName : ""# 使用指针当字段是空的fieldNullable : false# 生成的字段带有gorm tagfieldWithIndexTag : false# 生成的字段时候带有gorm type 标签fieldWithTypeTag : false
ubuntu将gobin加入到PATH的做法
个人来说,gentool没有被加入到PATH中,这边手动把GOPATH加入到PATH中,我用的是
zsh,所以把环境变量加入到~/.zshrc中,参考下面的命令
echo 'export PATH=$PATH:~/go/bin' | tee -a ~/.zshrc
现在gentool可以在任意地方被调用了
实例
在项目根目录新疆gentool文件里面写入内容
version: "0.1"
database:# consult[.html]"dsn : "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=true&loc=Local"# 选择mysql或者其他引擎,比方sqlserverdb : "mysql"# 指定要生成的table,流控则全部# 指定输出目录outPath : "./dao/query"# 输出的代码,默认gen.gooutFile : ""# 是否生成单元测试withUnitTest : false# generated model code's package name# 生成的model的代码的包名modelPkgName : "models"# 使用指针当字段是空的fieldNullable : false# 生成的字段带有gorm tagfieldWithIndexTag : false# 生成的字段时候带有gorm type 标签fieldWithTypeTag : false
然后使用gentool指定-c
结果如在dao包下生成了对应的models和query
使用gen代码工具的参合
package main// gorm gen configureimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gen"
)const MySQLDSN = "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=True"func connectDB(dsn string) *gorm.DB {db, err := gorm.Open(mysql.Open(dsn))if err != nil {panic(fmt.Errorf("connect db fail: %w", err))}return db
}func main() {// 指定生成代码的具体相对目录(相对当前文件),默认为:./query// 默认生成需要使用WithContext之后才可以查询的代码,但可以通过设置gen.WithoutContext禁用该模式g := gen.NewGenerator(gen.Config{// 默认会在 OutPath 目录生成CRUD代码,并且同目录下生成 model 包// 所以OutPath最终package不能设置为model,在有数据库表同步的情况下会产生冲突// 若一定要使用可以通过ModelPkgPath单独指定model package的名称OutPath: "dal/query",/* ModelPkgPath: "dal/model"*/// gen.WithoutContext:禁用WithContext模式// gen.WithDefaultQuery:生成一个全局Query对象Q// gen.WithQueryInterface:生成Query接口Mode: gen.WithDefaultQuery | gen.WithQueryInterface,})// 通常复用项目中已有的SQL连接配置db(*gorm.DB)// 非必需,但如果需要复用连接时的gorm.Config或需要连接数据库同步表信息则必须设置g.UseDB(connectDB(MySQLDSN))// 从连接的数据库为所有表生成Model结构体和CRUD代码// 也可以手动指定需要生成代码的数据表g.ApplyBasic(g.GenerateAllTable()...)// 执行并生成代码g.Execute()
}
实际上生成的代码与gentool一样
如何使用生成的代码?
-
首先生成代码
-
然后
-
可以参考如下增删改查
-
` - ```
func main() {
// 设置默认DB对象
query.SetDefault(dal.DB)
// 创建
b1 := model.Book{Title: "《Go语言之路》",Author: "七",PublishDate: time.Date(2023, 11, 15, 0, 0, 0, 0, time.UTC),Price: 100,
}
err := query.Book.WithContext(context.Background()).Create(&b1)
if err != nil {fmt.Printf("create book fail, err:%v\n", err)return
}// 更新
ret, err := query.Book.WithContext(context.Background()).Where(query.Book.ID.Eq(1)).Update(query.Book.Price, 200)
if err != nil {fmt.Printf("update book fail, err:%v\n", err)return
}
fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)// 查询
book, err := query.Book.WithContext(context.Background()).First()
// 也可以使用全局Q对象查询
//book, err := query.Q.Book.WithContext(context.Background()).First()
if err != nil {fmt.Printf("query book fail, err:%v\n", err)return
}
fmt.Printf("book:%v\n", book)// 删除
ret, err = query.Book.WithContext(context.Background()).Where(query.Book.ID.Eq(1)).Delete()
if err != nil {fmt.Printf("delete book fail, err:%v\n", err)return
}
fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)
}
更多推荐
gorm的自动化工具gen
发布评论