gorm 教程三 gen代码生成框架

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: gorm 教程三 gen代码生成框架

gorm gen

gorm 例子

Gen 支持所有GORM Driver从数据库生成结构, 使用示例: ```go 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添加模板方法,例如: ```go 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)) ```

生成的代码如下所示: ```go 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方法,例如: ```go

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中设置: ```go

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, }) go // 设置获取数据库名称函数 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 字段类型之间的映射关系。 ```go

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" },

1. // bool mapping
2. "tinyint": func(columnType gorm.ColumnType) (dataType string) {
3.     ct, _ := columnType.ColumnType()
4. if strings.HasPrefix(ct, "tinyint(1)") {
5. return "bool"
6.     }
7. return "byte"
8. },

}

g.WithDataTypeMap(dataMap)

```

Gen Tool

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

Install

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

Usage

gentool -h ```cmd

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 : ``p --tables="orders" # generate fromorders`

--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" yaml 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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
447 0
gin框架学习-Gorm入门指南
|
6月前
|
Go API 数据库
【Go 语言专栏】Go 语言中的 ORM 框架使用与比较
【4月更文挑战第30天】本文对比分析了Go语言中的常见ORM框架:GORM、XORM和BeeORM。GORM功能强大,支持复杂查询和关联关系处理,但可能影响性能;XORM以其简单易用和高性能受到青睐,但文档不全;BeeORM简洁高效,适合基础应用场景。选择ORM应考虑功能、性能、易用性和社区支持,根据项目需求进行评估和选择,以提升开发效率和应用性能。
443 0
|
3月前
|
关系型数据库 MySQL Go
Go - 代码生成工具
Go - 代码生成工具
34 3
|
11月前
|
Go
代码生成利器 - Go Generate
代码生成利器 - Go Generate
|
JSON 安全 Go
Go 语言怎么使用 zap 日志库?
Go 语言怎么使用 zap 日志库?
118 0
|
6月前
|
SQL Go 数据库
GORM入门到精通:构建高效Go应用的终极指南
在Go语言的世界里,数据持久化是一个不可或缺的话题。随着应用的复杂性增加,传统的数据库操作方式已经无法满足开发者对效率和便捷性的需求。这时,ORM(对象关系映射)框架应运而生,它将数据库表与对象模型之间建立映射,极大地简化了数据库操作。而在众多ORM框架中,GORM以其简洁、高效和功能丰富脱颖而出,成为了Go开发者的新宠。
|
6月前
|
设计模式 测试技术 Go
Go 项目必备:Wire 依赖注入工具的深度解析与实战应用
在现代软件开发中,依赖注入(Dependency Injection,简称 DI)已经成为一种广泛采用的设计模式。它的核心思想是通过外部定义的方式,将组件之间的依赖关系解耦,从而提高代码的可维护性、可扩展性和可测试性。然而,随着项目规模的增长,手动管理复杂的依赖关系变得日益困难。这时,依赖注入代码生成工具就显得尤为重要。在众多工具中,Wire 以其简洁、强大和易用性脱颖而出,成为 Go 语言项目中的宠儿。本文将带你深入了解 Wire 的安装、基本使用、核心概念以及高级用法,并通过一个实际的 web 博客项目示例,展示如何利用 Wire 简化依赖注入的实现。准备好了吗?让我们开始这场代码解耦的奇
|
JSON 中间件 Go
Go Gin 框架系列 - 入门篇
本文将会对 Go Gin 框架进行简单介绍,括它的一些优势和特点,然后通过一个入门示例,演示了如何安装和使用 Gin 启动一个 WEB 服务器并注册路由。
253 1
Go Gin 框架系列 - 入门篇
|
6月前
|
JSON 数据库 数据格式
gorm 教程三 gen自动代码生成工具
gorm 教程三 gen自动代码生成工具
543 0
Go 语言 context 最佳实践教程
Go 语言 context 最佳实践教程
371 1