gorm tag 是 Golang 中 GORM 库中的一个 struct tag,用于定义结构体字段与数据库表的映射关系。下面是一些常用的 gorm tag:

  • gorm:"column:xxx":指定字段对应数据库表中的列名为 xxx。
  • gorm:"primary_key":指定字段为主键。
  • gorm:"unique_index":指定字段为唯一索引。
  • gorm:"index":指定字段为普通索引。
  • gorm:"type:xxx":指定字段的数据库类型为 xxx。
  • gorm:"default:xxx":指定字段的默认值为 xxx。
  • gorm:"not null":指定字段为非空。
  • gorm:"auto_increment":指定字段为自增。
    例如:
type User struct {
    ID        int    `gorm:"primary_key"`
    Name      string `gorm:"column:name;unique_index"`
    Age       int    `gorm:"column:age;default:18"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

常用选项

  • column:指定数据库中的列名。
  • type:指定数据库中的数据类型。
  • primary_key:将该字段作为主键。
  • default:指定默认值。
  • not null:指定该字段不能为空。
  • unique:指定该字段的值必须唯一。
  • index:为该字段创建索引。
  • unique_index:为该字段创建唯一索引。
  • size:指定字段大小。
  • precision:指定字段精度。
  • scale:指定字段刻度。
  • auto_increment:指定该字段自增。
  • embedded:指定该字段为嵌入式结构体。
  • embedded_prefix:指定嵌入式结构体的前缀。

示例:

type User struct {
    ID        uint   `gorm:"primary_key"`
    Name      string `gorm:"size:255"`
    Age       int    `gorm:"not null"`
    Email     string `gorm:"unique_index"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

上面的代码中,我们使用了 GORM tag 定义了 User 结构体的字段映射关系。其中,ID 字段被标记为主键,Name 字段的大小为255,Age 字段不能为空,Email 字段的值必须唯一,CreatedAt 和 UpdatedAt 字段则没有做任何特殊处理。

gorm多字段索引设置tag
如果要在 User 模型中为 Name 和 Age 字段创建一个联合索引,可以这样写:

type User struct {
    ID   uint
    Name string `gorm:"index:idx_name_age"`
    Age  uint   `gorm:"index:idx_name_age"`
}

如果要在多个字段上创建单独的索引,可以使用不同的索引名称:

type User struct {
    ID   uint
    Name string `gorm:"index:idx_name"`
    Age  uint   `gorm:"index:idx_age"`
}

这将在数据库中创建两个单独的索引,一个是 idx_name,它只包含 Name 字段,另一个是 idx_age,它只包含 Age 字段。

gorm多字段联合唯一索引
可以使用AddIndex方法为模型添加联合唯一索引。例如,假设有一个User模型,需要为username和email这两个字段添加联合唯一索引,可以按照以下方式进行:

type User struct {
    ID       uint   `gorm:"primary_key"`
    Username string `gorm:"unique_index:user_email_idx;not null"`
    Email    string `gorm:"unique_index:user_email_idx;not null"`
    // 其他字段...
}

// 在模型的回调方法中添加索引
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
    // 添加联合唯一索引
    tx.AddIndex("user_email_idx", "username", "email")
    return nil
}

在上面的代码中,使用了unique_index标记为username和email字段添加了一个名为user_email_idx的联合唯一索引。在BeforeSave回调方法中,使用AddIndex方法将该索引添加到数据库中。

注意,为了避免出现重复数据,username和email字段都需要设置为not null。