从数据库生成表结构(数据库逆向工程)通过自动化和智能化工具,能够快速生成和更新数据库文档、代码模型及迁移脚本,确保代码与数据库结构的一致性,提高开发效率,降低维护成本,同时增强数据库的安全性、一致性和跨平台兼容性,是软件开发和维护过程中提升质量和效率的重要手段。
gorm提供了两种方式来生成结构:Gen 支持所有GORM Driver从数据库生成结构,使用Gen Tool工具从数据库生成结构;由于版本依赖问题,推荐使用没有依赖关系的GenTool来生成结构。
一、使用GenTool从数据库生成结构【推荐】
Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构
- 安装Gen Tool工具
go install gorm.io/gen/tools/gentool@latest
- 新建文件gen.tool
# Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构
# required: go install gorm.io/gen/tools/gentool@latest
# use cmd: gentool -c ".\gen\gen.tool"
# see more: https://gorm.io/zh_CN/gen/gen_tool.html
version: "0.1"
database:
# 不同驱动的dsn参考[https://gorm.io/docs/connecting_to_the_database.html]
# mysql dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
# input mysql or postgres or sqlite or sqlserver. consult[https://gorm.io/docs/connecting_to_the_database.html]
db: "postgres"
# enter the required data table or leave it blank.You can input : ["orders","users","goods"]
tables: ["evals","dialog_simulated_orders"]
# specify a directory for output
outPath: "./gen/model"
# query code file name, default: gen.go
outFile: ""
# generated model code's package name
modelPkgName : ""
# generate with pointer when field is nullable
fieldNullable : false
# generate field with gorm index tag
fieldWithIndexTag : false
# generate field with gorm column type tag
fieldWithTypeTag : false
onlyModel: true
withUnitTest: false
- 执行cmd命令 gentool -c “.\gen\gen.tool”
- 生成结果
- 更多的配置命令参考 https://gorm.io/zh_CN/gen/gen_tool.html
二、使用GenTool命令行选项生成结构
1.安装Gen Tool工具
go install gorm.io/gen/tools/gentool@latest
2.在命令行执行带有选项的GenTool指令:
gentool -db postgres -dsn "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai" -tables "evals" -outPath "./cmd/model"
3.支持更多的选项:https://gorm.io/zh_CN/gen/gen_tool.html
db
指定Driver,默认值“mysql”,referer:https://gorm.io/docs/connecting_to_the_database.htmldsn
用于连接数据库的DSN reference: https://gorm.io/docs/connecting_to_the_database.htmlfieldNullable
当字段允许空时用指针生成
fieldWithIndexTag
生成带有gorm index 标签的字段
fieldWithTypeTag
生成带有gorm type标签的字段
modelPkgName
生成模型代码包名称。
outFile
Genrated 查询代码文件名称,默认值:gen.go
outPath
指定输出目录(默认 “./dao/query”)
tables
指定要生成的表名称,默认所有表。
eg :
--tables="orders" # generate from `orders`
--tables="orders,users" # generate from `orders` and `users`
--tables="" # generate from all tables
Generate some tables code.
withUnitTest
生成单元测试,默认值 false, 选项: false / true
fieldSignable
Use signable datatype as field type, default value false, options: false / true
三、Gen 支持所有GORM Driver从数据库生成结构
- 示例代码:
package main
import (
"gorm.io/driver/postgres"
"gorm.io/gen"
"gorm.io/gorm"
)
func main() {
g := gen.NewGenerator(gen.Config{
OutPath: "./query", // 指定输出目录
Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode
// 如果你希望为可为null的字段生成属性为指针类型, 设置 FieldNullable 为 true
FieldNullable: true,
// 如果你希望在 `Create` API 中为字段分配默认值, 设置 FieldCoverable 为 true, 参考: https://gorm.io/docs/create.html#Default-Values
FieldCoverable: true,
// 如果你希望生成无符号整数类型字段, 设置 FieldSignable 为 true
FieldSignable: true,
// 如果你希望从数据库生成索引标记, 设置 FieldWithIndexTag 为 true
FieldWithIndexTag: true,
// 如果你希望从数据库生成类型标记, 设置 FieldWithTypeTag 为 true
FieldWithTypeTag: true,
// 如果你需要对查询代码进行单元测试, 设置 WithUnitTest 为 true
WithUnitTest: true,
})
gormdb, _ := gorm.Open(postgres.Open("postgres://username:pwd@address:port/database"))
g.UseDB(gormdb) // reuse your gorm db
// 自定义字段的数据类型
// 统一数字类型为int64,兼容protobuf
dataMap := map[string]func(detailType gorm.ColumnType) (dataType string){
"tinyint": func(detailType gorm.ColumnType) (dataType string) { return "uint8" },
"smallint": func(detailType gorm.ColumnType) (dataType string) { return "int32" },
"mediumint": func(detailType gorm.ColumnType) (dataType string) { return "int32" },
"bigint": func(detailType gorm.ColumnType) (dataType string) {
if detailType.Name() == "size" {
return "uint64"
}
return "uint32"
},
"int": func(detailType gorm.ColumnType) (dataType string) { return "uint32" },
}
// 要先于`ApplyBasic`执行
g.WithDataTypeMap(dataMap)
g.ApplyBasic(
// Generate struct `User` based on table `users`
g.GenerateModel("users"),
// Generate struct `Employee` based on table `users`
g.GenerateModelAs("users", "Employee"),
// Generate struct `User` based on table `users` and generating options
g.GenerateModel("users", gen.FieldIgnore("address"), gen.FieldType("id", "int64")),
// Generate struct `Customer` based on table `customer` and generating options
// customer table may have a tags column, it can be JSON type, gorm/gen tool can generate for your JSON data type
g.GenerateModel("customer", gen.FieldType("tags", "datatypes.JSON")),
)
g.ApplyBasic(
// Generate structs from all tables of current database
g.GenerateAllTable()...,
)
g.Execute()
}
- 可能会遇到如下的错误:
- 更新所需要的依赖包:
go get -u gorm.io/driver/postgres
go get -u gorm.io/plugin/dbresolver
go mod tidy
go mod vendor
- 当前所使用的版本:
require (
gorm.io/driver/postgres v1.5.11
gorm.io/plugin/dbresolver v1.5.3 // indirect
gorm.io/gen v0.3.26
gorm.io/gorm v1.25.12
)
免费试用
更多热门智能应用