• gorm的自动化工具gen_已设置图床


    gorm的自动化工具gen

    官方

    https://gorm.io/zh_CN/gen/
    
    • 1

    假设数据库结构

    Image1

    这里使用gen-tool

    安装

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

    用法

    gentool -h
    
    Usage of gentool:
     -c string
           配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 
     -db string
           指定Driver,默认值“mysql”,referer:https://gorm.io/docs/connecting_to_the_database.html
     -dsn string
           用于连接数据库的DSN reference: https://gorm.io/docs/connecting_to_the_database.html
     -fieldNullable
           当字段允许空时用指针生成
     -fieldWithIndexTag
           生成带有gorm index 标签的字段
     -fieldWithTypeTag
           生成带有gorm type标签的字段
     -modelPkgName string
           生成模型代码包名称。
     -outFile string
           Genrated 查询代码文件名称,默认值:gen.go
     -outPath string
           指定输出目录(默认 “./dao/query”)
     -tables string
           指定要生成的表名称,默认所有表。
     -onlyModel
           指生成Models不生成对应的query
     -withUnitTest
           生成单元测试,默认值 false, 选项: false / true
     -fieldSignable
           detect integer field's unsigned type, adjust generated data type
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    Example

    gentool -dsn "user:pwd@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" -tables "orders,doctor"
    
    gentool -c "./gen.tool" # 配置文件像下面
    
    • 1
    • 2
    • 3
    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"
      # 选择mysql或者其他引擎,比方sqlserver
      db  : "mysql"
      # 指定要生成的table,流控则全部
      tables  : "user"
      # 指定输出目录
      outPath :  "./dao/query"
      # 输出的代码,默认gen.go
      outFile :  ""
      # 是否生成单元测试
      withUnitTest  : false
      # generated model code's package name
      # 生成的model的代码的包名
      modelPkgName  : ""
      # 使用指针当字段是空的
      fieldNullable : false
      # 生成的字段带有gorm tag
      fieldWithIndexTag : false
      # 生成的字段时候带有gorm type 标签
      fieldWithTypeTag  : false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    ubuntu将gobin加入到PATH的做法

    个人来说,gentool没有被加入到PATH中,这边手动把GOPATH加入到PATH中,我用的是

    zsh,所以把环境变量加入到~/.zshrc中,参考下面的命令

    Image2

    echo 'export PATH=$PATH:~/go/bin' | tee -a ~/.zshrc
    
    • 1

    现在gentool可以在任意地方被调用了

    Image3

    实例

    在项目根目录新疆gentool文件里面写入内容

    version: "0.1"
    database:
      # consult[https://gorm.io/docs/connecting_to_the_database.html]"
      dsn : "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=true&loc=Local"
      # 选择mysql或者其他引擎,比方sqlserver
      db  : "mysql"
      # 指定要生成的table,流控则全部
      # 指定输出目录
      outPath :  "./dao/query"
      # 输出的代码,默认gen.go
      outFile :  ""
      # 是否生成单元测试
      withUnitTest  : false
      # generated model code's package name
      # 生成的model的代码的包名
      modelPkgName  : "models"
      # 使用指针当字段是空的
      fieldNullable : false
      # 生成的字段带有gorm tag
      fieldWithIndexTag : false
      # 生成的字段时候带有gorm type 标签
      fieldWithTypeTag  : false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    然后使用gentool指定-c

    结果如在dao包下生成了对应的models和query

    Image4

    使用gen代码工具的参合

    package main
    
    // gorm gen configure
    
    import (
    	"fmt"
    
    	"gorm.io/driver/mysql"
    	"gorm.io/gorm"
    
    	"gorm.io/gen"
    )
    
    const MySQLDSN = "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=True"
    
    func connectDB(dsn string) *gorm.DB {
    	db, err := gorm.Open(mysql.Open(dsn))
    	if err != nil {
    		panic(fmt.Errorf("connect db fail: %w", err))
    	}
    	return db
    }
    
    func main() {
    	// 指定生成代码的具体相对目录(相对当前文件),默认为:./query
    	// 默认生成需要使用WithContext之后才可以查询的代码,但可以通过设置gen.WithoutContext禁用该模式
    	g := gen.NewGenerator(gen.Config{
    		// 默认会在 OutPath 目录生成CRUD代码,并且同目录下生成 model 包
    		// 所以OutPath最终package不能设置为model,在有数据库表同步的情况下会产生冲突
    		// 若一定要使用可以通过ModelPkgPath单独指定model package的名称
    		OutPath: "dal/query",
    		/* ModelPkgPath: "dal/model"*/
    
    		// gen.WithoutContext:禁用WithContext模式
    		// gen.WithDefaultQuery:生成一个全局Query对象Q
    		// gen.WithQueryInterface:生成Query接口
    		Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
    	})
    
    	// 通常复用项目中已有的SQL连接配置db(*gorm.DB)
    	// 非必需,但如果需要复用连接时的gorm.Config或需要连接数据库同步表信息则必须设置
    	g.UseDB(connectDB(MySQLDSN))
    
    	// 从连接的数据库为所有表生成Model结构体和CRUD代码
    	// 也可以手动指定需要生成代码的数据表
    	g.ApplyBasic(g.GenerateAllTable()...)
    
    	// 执行并生成代码
    	g.Execute()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    实际上生成的代码与gentool一样

    Image5

    如何使用生成的代码?

    1. 首先生成代码

    2. 然后

    3. Image6

    4. 可以参考如下增删改查

    5. ` - ```

    func main() {
    // 设置默认DB对象
    query.SetDefault(dal.DB)

    // 创建
    b1 := model.Book{
    	Title:       "《Go语言之路》",
    	Author:      "七",
    	PublishDate: time.Date(2023, 11, 15, 0, 0, 0, 0, time.UTC),
    	Price:       100,
    }
    err := query.Book.WithContext(context.Background()).Create(&b1)
    if err != nil {
    	fmt.Printf("create book fail, err:%v\n", err)
    	return
    }
    
    // 更新
    ret, err := query.Book.WithContext(context.Background()).
    	Where(query.Book.ID.Eq(1)).
    	Update(query.Book.Price, 200)
    if err != nil {
    	fmt.Printf("update book fail, err:%v\n", err)
    	return
    }
    fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)
    
    // 查询
    book, err := query.Book.WithContext(context.Background()).First()
    // 也可以使用全局Q对象查询
    //book, err := query.Q.Book.WithContext(context.Background()).First()
    if err != nil {
    	fmt.Printf("query book fail, err:%v\n", err)
    	return
    }
    fmt.Printf("book:%v\n", book)
    
    // 删除
    ret, err = query.Book.WithContext(context.Background()).Where(query.Book.ID.Eq(1)).Delete()
    if err != nil {
    	fmt.Printf("delete book fail, err:%v\n", err)
    	return
    }
    fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    }

    • 相关阅读:
      Python编程 print输出函数
      代码随想录算法训练营第一天 | 704. 二分查找 | 27. 移除元素
      30+的女生学习做软件测试有前景吗?
      直饮水表和智能水表有什么区别?
      1.常用文件管理命令
      背包问题总结
      Java如何使用for each遍历LinkedList链表集合中的元素呢?
      JSD-2204-查询管理员列表-删除管理员-Day15
      Ceph对象存储
      Quarto 入门教程 (2):如何使用并编译出不同文档
    • 原文地址:https://blog.csdn.net/qq_42901723/article/details/134321001