GORM:使用GenTool工具从数据库生成结构 | 客服服务营销数智化洞察_晓观点
       

GORM:使用GenTool工具从数据库生成结构

从数据库生成表结构(数据库逆向工程)通过自动化和智能化工具,能够快速生成和更新数据库文档、代码模型及迁移脚本,确保代码与数据库结构的一致性,提高开发效率,降低维护成本,同时增强数据库的安全性、一致性和跨平台兼容性,是软件开发和维护过程中提升质量和效率的重要手段。

gorm提供了两种方式来生成结构:Gen 支持所有GORM Driver从数据库生成结构,使用Gen Tool工具从数据库生成结构;由于版本依赖问题,推荐使用没有依赖关系的GenTool来生成结构。

一、使用GenTool从数据库生成结构【推荐】

Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构

  1. 安装Gen Tool工具
go install gorm.io/gen/tools/gentool@latest
  1. 新建文件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
  1. 执行cmd命令 gentool -c “.\gen\gen.tool”
  1. 生成结果
  1. 更多的配置命令参考 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从数据库生成结构

  1. 示例代码:
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()
}
  1. 可能会遇到如下的错误:
  1. 更新所需要的依赖包:
go get -u gorm.io/driver/postgres
go get -u gorm.io/plugin/dbresolver

go mod tidy
go mod vendor
  1. 当前所使用的版本:
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
)
免费试用 更多热门智能应用                        
(0)
研发专家-kuan研发专家-kuan
上一篇 2024年12月22日
下一篇 2024年12月25日

相关推荐