gen 代码生成器使用
GORM gen 是官方代码生成器,可根据数据库表结构自动生成模型与 DAO 代码,本文介绍其使用方式。
安装与初始化
安装工具
Bash
go get gorm.io/gen
生成脚本
Go
// cmd/gen/main.go
package main
import (
"gorm.io/gen"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 1. 连接数据库
db, _ := gorm.Open(mysql.Open("root:pass@tcp(localhost:3306)/mydb"))
// 2. 初始化生成器
g := gen.NewGenerator(gen.Config{
OutPath: "./dao", // 输出目录
Mode: gen.WithoutContext | gen.WithDefaultQuery,
ModelPkgPath: "./model", // 模型输出目录
})
// 3. 绑定数据库
g.UseDB(db)
// 4. 生成指定表
g.GenerateModel("users")
g.GenerateModel("orders")
// 5. 生成所有表
// g.GenerateAllTable()
// 6. 执行生成
g.Execute()
}
生成结果
模型代码
自动生成 model/users.gen.go:
Go
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
import "time"
type User struct {
ID uint `gorm:"column:id;primaryKey"`
Name string `gorm:"column:name;type:varchar(100)"`
Email string `gorm:"column:email;type:varchar(255)"`
CreatedAt time.Time `gorm:"column:created_at"`
UpdatedAt time.Time `gorm:"column:updated_at"`
}
func (User) TableName() string {
return "users"
}
DAO 代码
自动生成 dao/users.gen.go:
Go
package dao
import (
"context"
"gorm.io/gen"
"myapp/model"
)
type IUserDo interface {
gen.SubQuery
Debug() *UserDo
WithContext(ctx context.Context) *UserDo
Create(values ...*model.User) error
Find() ([]*model.User, error)
Where(opts ...gen.Condition) *UserDo
Order(columns ...gen.Field) *UserDo
Limit(limit int) *UserDo
First() (*model.User, error)
// ... 更多方法
}
var User *userDo
type userDo struct {
gen.DO
}
高级配置
自定义字段映射
Go
g.GenerateModel("users",
gen.FieldType("id", "uint64"), // 修改字段类型
gen.FieldTag("email", `json:"email"`), // 添加标签
gen.FieldIgnoreRegexp("temp_*"), // 忽略匹配字段
)
关联关系生成
Go
g.GenerateModel("orders",
gen.RelateField(gen.HasMany, "User", "user_id"),
gen.RelateField(gen.BelongsTo, "Product", "product_id"),
)
自定义方法
Go
// 在生成器中注册扩展方法
g.ApplyBasic(
// 自定义模型方法
model.User{},
)
// 生成接口方法
g.ApplyInterface(func(model.Methods) {}, model.User{})
使用生成的 DAO
Go
// 初始化
q := dao.Use(db)
// 链式查询
users, err := q.User.WithContext(ctx).
Where(q.User.Age.Gt(18)).
Order(q.User.CreatedAt.Desc()).
Limit(10).
Find()
// 创建
err := q.User.WithContext(ctx).Create(&user)
// 更新
_, err = q.User.WithContext(ctx).
Where(q.User.ID.Eq(1)).
Update(q.User.Name, "new_name")
// 删除
_, err = q.User.WithContext(ctx).
Where(q.User.ID.Eq(1)).
Delete()
注意事项
生成代码后请勿手动修改,重新生成会被覆盖。自定义逻辑应通过扩展方法实现。
gen依赖数据库连接读取表结构,确保生成时数据库可访问。
复杂关联关系建议手动调整生成的模型字段类型。
要点总结
gen通过连接数据库读取表结构自动生成代码- 生成模型(struct)与 DAO 接口两部分
- 支持自定义字段映射、关联关系、忽略规则
- 生成的 DAO 支持链式查询、类型安全
- 生成代码不应手动修改,自定义逻辑通过扩展实现
存放路径:D:\git2\jwdev\articles\GORM\专家\生态与工具链\gen 代码生成器使用.md
📝 发现内容有误?点击此处直接编辑