文章目录
官方地址:https://gorm.io/zh_CN/gen/index.html
以mysql为例
建项目
go
go mod init 项目名称
go mod tidy
建库建表
建数据库demo
,正常排序和字符集utf8mb4
即可
在数据库内建表,可参考如下代码:
sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
role VARCHAR(50),
age INT
);
CREATE TABLE companies (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
main.go
安装gen
go
go get -u gorm.io/gen
前大半部分为官方快速入门的代码,后尝试创建用户的部分可自行调整。
go
package main
import (
"context"
"gorm-gen-demo/model"
"gorm-gen-demo/query"
"gorm.io/driver/mysql"
"gorm.io/gen"
"gorm.io/gorm"
"log"
)
// Dynamic SQL
type Querier interface {
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
FilterWithNameAndRole(name, role string) ([]gen.T, error)
}
func main() {
dsn := "user:password@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local" //替换成自己的,此句两次执行代码均保留
// ------------------------------- 官方代码
gormdb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("failed to connect database: %v", err)
}
g := gen.NewGenerator(gen.Config{
OutPath: "query",
Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate model
})
g.UseDB(gormdb) // reuse your gorm db
// Generate basic type-safe DAO API for struct `model.User` following conventions
g.ApplyBasic(model.User{})
// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
g.ApplyInterface(func(Querier) {}, model.User{}, model.Company{})
// Generate the code
g.Execute()
// ------------------------------------上下两段代码可分两次执行
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
query.SetDefault(db)
user := model.User{Name: "Modi", Age: 18}
u := query.User
ctx := context.Background()
err = u.WithContext(ctx).Create(&user)
if err != nil {
log.Fatalf("failed to create user: %v", err)
}
}
其中尝试创建用户部分,query.SetDefault(db)
句不可少,否则会报错panic: runtime error: invalid memory address or nil pointer dereference
接下来两个文件都是在根目录下的model文件夹下新建,定义数据库表结构所用
user.go
go
package model
type User struct {
ID int
Name string
Role string
Age int
}
company.go
go
package model
type Company struct {
ID int
Name string
}
生成效果
(更进一步)自定义dynamic SQL实践
如果添加了自定义注解的sql查询,需要先gen生成,然后再调用自定义的函数查询 !否则会报错,说不认识自定义的这个函数
unresovled
。
代码:
go
// Dynamic SQL
type Querier interface {
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
// FilterWithNameAndRole(name, role string) ([]gen.T, error)
// 添加注解和函数注册!!!
//
// SELECT * FROM @@table WHERE id=@id
GetByID(id int) (gen.T, error) // returns struct and error
}
// main中添加绑定!!!
g.ApplyInterface(func(Querier) {}, model.User{}) // 绑定的是User结构体,所以只会在user.gen.go里注册和实现
写好注解和函数,进行g.Execute()
,可以在user.gen.go里看到如下已经被注册的函数:

进行调用查询,添加代码:
go
res, err := query.User.WithContext(context.Background()).GetByID(1)
if err != nil {
fmt.Printf("GetByID failed , err:%v\n", err)
return
}
fmt.Printf("GetByID result : %v", res)
查询结果:
第一遍生成,第二遍才是在调用
GetByID
这个新自定义函数
