全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 8 分钟 ✍️ juanwangdev

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 权限与审计日志
下一篇 → 测试与 Mock 实践
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库