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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
JSON 关系型数据库 Go
gorm 教程三 gen代码生成框架
gorm 教程三 gen代码生成框架
467 0
|
数据库
gorm 事务的使用
gorm 事务的使用
443 0
|
Linux 容器 Docker
Debian配置系统中文语言及环境
Debian配置系统中文语言及环境
14119 1
|
Oracle Java 关系型数据库
Oracle jdk 的国内下载镜像
Oracle jdk 的国内下载镜像
57707 0
|
监控 网络协议 Nacos
介绍一下Nacos
介绍一下Nacos
|
7月前
|
SQL 数据库连接 Go
Go语言数据库编程:GORM 的基本使用
GORM 是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近高层语言的 ORM。本文介绍了 GORM 的安装与初始化、模型定义、自动迁移、基本 CRUD 操作、条件构造器、钩子函数、事务处理、日志调试等内容,帮助开发者快速掌握其使用方法。
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
499 1
|
9月前
|
JSON JavaScript 前端开发
gRPC技术中的gRPC到HTTP的转换
从上述内容,我们可以看到,gRPC到HTTP的转换并没有改变gRPC强大的性能和可扩展性。它只是让这些强大的功能能更好地适应不同的环境和需求,兼容了更广泛的网络设施。所以,技术总是在变化,并且始终在寻找更好的平衡点,以满足不断变化的业务需求。我们也应该持续学习,掌握这些新的变化,以便更好地解决实际问题。
404 11
|
存储 JSON 前端开发
gin框架学习笔记(四) ——参数绑定与参数验证
gin框架学习笔记(四) ——参数绑定与参数验证
616 0
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
755 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库

热门文章

最新文章