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

gorm的自动化工具gen

官方

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

假设数据库结构如

Image1

这里使用gen-tool

安装

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

用法

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

Example

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"
  # 选择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

ubuntu将gobin加入到PATH的做法

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

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

Image2

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

现在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

然后使用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()
}

实际上生成的代码与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)

}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值