返回

将繁琐的代码编写变为自动化,GORM 强大而易用的代码生成工具 gorm/gen

后端

GORM 代码生成工具:自动生成 GORM 模型、查询和迁移代码

简介

GORM 是 Go 中使用广泛的 ORM 框架。它简化了与数据库的交互,使其操作更加方便、高效。然而,在使用 GORM 过程中,经常会出现一些重复性较强的工作,如生成表结构到 GORM 模型结构体的代码、生成迁移代码、生成返回所有字段的查询以及生成返回特定字段的查询。

为了解决这些问题,GORM 推出了其代码生成工具 gen 。gen 可以自动生成上述代码,大大减轻开发人员的工作负担。

安装

安装 gen 非常简单,只需要执行以下命令:

go install github.com/go-gorm/gen/cmd/gen@latest

使用

gen 的使用也非常简单,只需要提供数据库表名即可。例如,要生成 user 表的 GORM 模型结构体代码,可以执行以下命令:

gen -dbtype=mysql -host=127.0.0.1 -user=root -password=123456 -database=mydb user

这样就会生成一个 user.go 文件,其中包含了 user 表的 GORM 模型结构体。

详细用法

除了生成简单的 GORM 模型结构体代码外,gen 还有一些更详细的用法,可以通过命令行参数进行控制:

  • -singleTable :指定生成的模型是否为单表模式。
  • -genPkg :指定生成代码所在的包名。
  • -srcPkg :指定从哪个包读取模板文件。
  • -excludeTable :指定需要排除的表。

代码示例

// user.go
package models

import (
    "time"

    "github.com/go-gorm/gen/annotation"
)

type User struct {
    ID        int64       `gorm:"primary_key"`
    Username  string      `gorm:"type:varchar(64);unique_index"`
    Password  string      `gorm:"type:varchar(128)"`
    Email     string      `gorm:"type:varchar(256);unique_index"`
    Phone     string      `gorm:"type:varchar(32);unique_index"`
    Avatar    string      `gorm:"type:varchar(256)"`
    Status    int32       `gorm:"type:int"`
    CreatedAt time.Time   `gorm:"autoCreateTime"`
    UpdatedAt time.Time   `gorm:"autoUpdateTime"`
    DeletedAt *time.Time `gorm:"index"`
}

func (u *User) TableName() string {
    return "user"
}

func (u *User) BeforeCreate() (err error) {
    u.CreatedAt = time.Now().UTC()
    return nil
}

func (u *User) BeforeUpdate() (err error) {
    u.UpdatedAt = time.Now().UTC()
    return nil
}

func (u *User) Annotation() annotation.Annotation {
    return annotation.Annotation{
        FieldAdd: map[string]annotation.FieldAdd{
            "Status": {
                Default: "1",
            },
        },
    }
}

// main.go
package main

import (
    "context"

    "github.com/go-gorm/gen/models"
)

func main() {
    // 初始化数据库连接
    db, err := gorm.Open(mysql.Open("root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"))
    if err != nil {
        panic(err)
    }

    // 使用 gen 生成的模型进行操作
    userService := models.NewUserService(db)
    user, err := userService.Find(context.Background(), "admin")
    if err != nil {
        panic(err)
    }
    fmt.Println(user)
}

常见问题解答

1. gen 能否生成所有表的代码?

是的,gen 可以通过指定 -all 参数生成所有表的代码。

2. gen 是否支持自定义模板?

是的,gen 支持自定义模板。可以指定 -tmpl 参数指定自定义模板文件。

3. gen 是否支持生成查询代码?

是的,gen 可以通过指定 -query 参数生成查询代码。

4. gen 是否支持生成迁移代码?

是的,gen 可以通过指定 -migrate 参数生成迁移代码。

5. gen 是否支持生成注释?

是的,gen 可以通过指定 -annotation 参数生成注释。

结论

GORM 代码生成工具 gen 是一个非常有用的工具,它可以自动生成 GORM 模型结构体代码、查询代码、迁移代码和注释。这大大简化了使用 GORM 的过程,提高了开发效率。