gorm 教程三 gen自动代码生成工具

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: gorm 教程三 gen自动代码生成工具

gorm gen

gorm 例子

Gen 支持所有GORM Driver从数据库生成结构, 使用示例:

package main
import "gorm.io/gen"
func main() {
  g := gen.NewGenerator(gen.Config{
    //  设置输出路径
    OutPath: "../query",
    Mode: gen.WithoutContext|gen.WithDefaultQuery|gen.WithQueryInterface, // 选择生成模式
  })
//  建立数据库连接
  gormdb, _ := gorm.Open(mysql.Open("root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"))
  g.UseDB(gormdb) // 选择数据库连接
  // 为结构模型生成基本类型安全的 DAO API。用户的以下约定
  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")),
  )
g.ApplyBasic(
// 从当前数据库的所有表生成结构
g.GenerateAllTable()...,
)
  // 生成代码
  g.Execute()
}

模板方法

当从数据库生成结构时,您也可以通过面的方式,给生成的model添加模板方法,例如:

type CommonMethod struct {
    ID   int32
    Name *string
}
func (m *CommonMethod) IsEmpty() bool {
    if m == nil {
        return true
    }
    return m.ID == 0
}
func (m *CommonMethod) GetName() string {
    if m == nil || m.Name == nil {
        return ""
    }
    return *m.Name
}
// 将 IsEmpty 方法添加到生成的“People”结构中
g.GenerateModel("people", gen.WithMethod(CommonMethod{}.IsEmpty))
// 将CommonMethod上定义的所有方法添加到生成的“User”结构中
g.GenerateModel("user", gen.WithMethod(CommonMethod))

生成的代码如下所示:

type Person struct {
  // ...
}
func (m *Person) IsEmpty() bool {
  if m == nil {
    return true
  }
  return m.ID == 0
}
// Generated User struct
type User struct {
  // ...
}
func (m *User) IsEmpty() bool {
  if m == nil {
    return true
  }
  return m.ID == 0
}
func (m *User) GetName() string {
  if m == nil || m.Name == nil {
    return ""
  }
  return *m.Name
}

自定义表名称

当从数据库生成结构时,您也可以通过实现自己的TableName方法,例如:

type CommonMethod struct {
    ID   int32
    Name *string
}
// TableName 
func (m CommonMethod) TableName() string {
    return "@@table"
}
// TableName table name with gorm NamingStrategy
func (m CommonMethod) TableName(namer schema.Namer) string {
    if namer == nil {
        return "@@table"
    }
    return namer.TableName("@@table")
}
// 生成的“user”结构的表名方法
g.GenerateModel("user", gen.WithMethod(CommonMethod{}.TableName))
// 自定义生成的所有结构的表名方法
g.WithOpts(gen.WithMethod(CommonMethod{}.TableName))
// 为生成的所有结构设置默认 DIY 表名方法
g.WithOpts(gen.WithMethod(gen.DefaultMethodTableWithNamer))

Field Options

以下是可以在生成模型/生成模型期间使用的选项

FieldNew // 创建一个新字段

FieldIgnore // 忽略一个字段

FieldIgnoreReg // 正则匹配的方法忽略字段

FieldRename // 重命名结构体的字段

FieldComment // 在生成的结构中指定字段注释

FieldType // 指定字段类型

FieldTypeReg // specify field type (match with regexp)

FieldGenType // 指定字段生成类型

FieldGenTypeReg // specify field gen type (match with regexp)

FieldTag // 指定 gorm 和 JSON 标记

FieldJSONTag // specify json tag

FieldJSONTagWithNS // 使用名称策略指定 JSON 标记

FieldGORMTag // specify gorm tag

FieldNewTag // 追加一个新字段

FieldNewTagWithNS // 使用名称策略指定新标记

FieldTrimPrefix // 修剪列前缀

FieldTrimSuffix // 修剪列后缀

FieldAddPrefix // 将前缀添加到结构字段的名称

FieldAddSuffix // 将后缀添加到结构字段的名称

FieldRelate // 指定与其他表的关系

FieldRelateModel // 确定与现有模型的关系


全局生成选项

Gen 有一些全局选项可以在 gen.Config中设置:

g := gen.NewGenerator(gen.Config{
  // 如果希望可为空字段生成属性为指针类型,请将 FieldNullable 设置为 true
  FieldNullable: true,
  // 如果要分配在“创建”API 中具有默认值的字段,请将 FieldCoverable 设置为 true
  FieldCoverable: true,
  // 如果要生成具有无符号整数类型的字段,请将字段可签名设置为 true
  FieldSignable: true,
  // 如果要从数据库生成索引标记,请将 FieldWithIndexTag 设置为 true
  FieldWithIndexTag: true,
  // 如果要从数据库生成类型标记,请将 FieldWithTypeTag 设置为 true
  FieldWithTypeTag: true,
  // if you need unit tests for query code, set WithUnitTest true
  WithUnitTest: true,
})
//  设置获取数据库名称函数
WithDbNameOpts(opts ...model.SchemaNameOpt)
//  指定表名命名策略,仅在从数据库同步表时有效
WithTableNameStrategy(ns func(tableName string) (targetTableName string))
// 指定模型结构名称命名策略,仅在从数据库同步表时有效
// 如果返回空字符串,则将忽略该表
WithModelNameStrategy(ns func(tableName string) (modelName string))
// 指定文件名命名策略,仅在从数据库同步表时有效
WithFileNameStrategy(ns func(tableName string) (fileName string))
// 指定 JSON 标记命名策略
WithJSONTagNameStrategy(ns func(columnName string) (tagContent string))
// 指定数据类型映射关系,仅在从 DB 同步表时工作
WithDataTypeMap(newMap map[string]func(gorm.ColumnType) (dataType string))
// 指定导入包路径
WithImportPkgPath(paths ...string)
// 指定全局模型选项
WithOpts(opts ...ModelOpt)

数据类型映射

指定model属性类型和 db 字段类型之间的映射关系。

var dataMap = map[string]func(gorm.ColumnType) (dataType string){
    // int mapping
    "int": func(columnType gorm.ColumnType) (dataType string) {
        if n, ok := columnType.Nullable(); ok && n {
            return "*int32"
        }
        return "int32"
    },
    // bool mapping
    "tinyint": func(columnType gorm.ColumnType) (dataType string) {
        ct, _ := columnType.ColumnType()
        if strings.HasPrefix(ct, "tinyint(1)") {
            return "bool"
        }
        return "byte"
    },
}
g.WithDataTypeMap(dataMap)

Gen Tool

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

Install

go install gorm.io/gen/tools/gentool@latest

Usage

gentool -h

Usage of gentool:
 -c string
      配置文件路径
 -db string
       选择数据库种类
 -dsn string
       设置数据库连接地址
 -fieldNullable
       当字段可为空时,使用指针生成
 -fieldWithIndexTag
       使用 GORM 索引标签生成字段
 -fieldWithTypeTag
       生成带有 GORM 列类型标记的字段
 -modelPkgName string
       生成的模型代码的包名称
 -outFile string
       查询代码文件名,默认:gen.go
 -outPath string
      指定输出目录
 -tables string
       输入所需的数据表或将其留空
 -onlyModel
       仅生成模型
 -withUnitTest
       为查询代码生成单元测试
 -fieldSignable
       检测整数字段的无符号类型,调整生成的数据类型

c

配置文件名、默认值 “”、命令行选项的优先级高于配置文件。

db

指定Driver,默认值“mysql”

dsn

用于连接数据库的DSN 例子:“root:password@tcp(localhost:3306)/test?charset=utf8mb4&parseTime=True”

fieldNullable

当字段允许空时用指针生成

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

例子

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[https://gorm.io/docs/connecting_to_the_database.html]"
  dsn : "username:password@tcp(address:port)/db?charset=utf8mb4&parseTime=true&loc=Local"
  # input mysql or postgres or sqlite or sqlserver. consult[https://gorm.io/docs/connecting_to_the_database.html]
  db  : "mysql"
  # enter the required data table or leave it blank.You can input : orders,users,goods
  tables  : "user"
  # specify a directory for output
  outPath :  "./dao/query"
  # query code file name, default: gen.go
  outFile :  ""
  # generate unit test for query code
  withUnitTest  : false
  # 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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
JSON 关系型数据库 Go
gorm 教程三 gen代码生成框架
gorm 教程三 gen代码生成框架
127 0
|
数据可视化 IDE 编译器
Open CASCADE之v7.4.0源码编译与可视化调试,使用VS2017+32位编译器(1)
Open CASCADE之v7.4.0源码编译与可视化调试,使用VS2017+32位编译器
1022 0
Open CASCADE之v7.4.0源码编译与可视化调试,使用VS2017+32位编译器(1)
|
8月前
|
SQL BI 数据库
介绍一款 ABAP 代码搜索工具 RS_ABAP_SOURCE_SCAN 的使用方法
介绍一款 ABAP 代码搜索工具 RS_ABAP_SOURCE_SCAN 的使用方法
93 0
|
5月前
|
Go
代码生成利器 - Go Generate
代码生成利器 - Go Generate
|
7月前
|
JSON 安全 Go
Go 语言怎么使用 zap 日志库?
Go 语言怎么使用 zap 日志库?
73 0
|
6天前
|
Go
Go命令行解析神器入门 - 10分钟上手flag包
Go命令行解析神器入门 - 10分钟上手flag包
52 0
|
5月前
|
存储 JSON 监控
go配置解析库 - viper
go配置解析库 - viper
|
7月前
|
Go
Go 语言跨平台文件监听库 fsnotify 怎么使用?
Go 语言跨平台文件监听库 fsnotify 怎么使用?
60 0
|
7月前
|
JavaScript API
domutils 工具库的使用方法介绍
domutils 工具库的使用方法介绍
37 0
|
10月前
|
Go 开发者
[Go开源工具] go-optioner:轻松生成函数选项模式代码
你是否使用过 functional options 函数选项模式?在使用时,你是否遇到过多字段的结构体而需要手动编写大量的设置选项函数的代码? 本文介绍了 go-opioner 开源工具的安装和使用,它能够根据结构体的定义,自动生成函数选项模式的代码。
103 0