教程

公约

qianmoQqianmoQ· 更新于 2026-09-23· 阅读 8 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

ID 作为主键

GORM 默认使用名为 ID 的字段作为表的主键。

type User struct {
  ID   string 
  Name string
}

你可以通过 primaryKey 标签将其他字段设置为主键:

type Animal struct {
  ID     int64
  UUID   string `gorm:"primaryKey"`
  Name   string
  Age    int64
}

另请参阅复合主键。

复数表名

GORM 会将结构体名称复数化并转换为 snake_case 作为表名。例如,结构体 User 的表名按照约定为 users。

TableName

你可以通过实现 Tabler 接口来更改默认表名,例如:

type Tabler interface {
  TableName() string
}


func (User) TableName() string {
  return "profiles"
}

注意 TableName 不允许使用动态名称,其结果会被缓存供后续使用。如需使用动态名称,可以使用 Scopes,例如:

func UserTable(user User) func (tx *gorm.DB) *gorm.DB {
  return func (tx *gorm.DB) *gorm.DB {
    if user.Admin {
      return tx.Table("admin_users")
    }

    return tx.Table("users")
  }
}

db.Scopes(UserTable(user)).Create(&user)

临时指定表名

使用 Table 方法临时指定表名,例如:

db.Table("deleted_users").AutoMigrate(&User{})


var deletedUsers []User
db.Table("deleted_users").Find(&deletedUsers)


db.Table("deleted_users").Where("name = ?", "jinzhu").Delete(&User{})

请参阅 From SubQuery 了解如何在 FROM 子句中使用子查询。

NamingStrategy

GORM 允许用户通过覆盖默认的 NamingStrategy 来更改默认的命名约定。该策略用于构建 TableName、ColumnName、JoinTableName、RelationshipFKName、CheckerName、IndexName,详情请参阅 GORM 配置。

列名

数据库列名按照约定使用字段名称的 snake_case 形式。

type User struct {
  ID        uint      
  Name      string    
  Birthday  time.Time 
  CreatedAt time.Time 
}

你可以通过 column 标签覆盖列名,或使用 NamingStrategy:

type Animal struct {
  AnimalID int64     `gorm:"column:beast_id"`         
  Birthday time.Time `gorm:"column:day_of_the_beast"` 
  Age      int64     `gorm:"column:age_of_the_beast"` 
}

时间戳跟踪

CreatedAt

对于包含 CreatedAt 字段的模型,当记录首次创建时,如果该字段的值为零值,则会被设置为当前时间。

db.Create(&user) 

user2 := User{Name: "jinzhu", CreatedAt: time.Now()}
db.Create(&user2) 


db.Model(&user).Update("CreatedAt", time.Now())

你可以通过将 autoCreateTime 标签设置为 false 来禁用时间戳跟踪,例如:

type User struct {
  CreatedAt time.Time `gorm:"autoCreateTime:false"`
}

UpdatedAt

对于包含 UpdatedAt 字段的模型,当记录被更新或创建时,如果该字段的值为零值,则会被设置为当前时间。

db.Save(&user) 

db.Model(&user).Update("name", "jinzhu") 

db.Model(&user).UpdateColumn("name", "jinzhu") 

user2 := User{Name: "jinzhu", UpdatedAt: time.Now()}
db.Create(&user2) 

user3 := User{Name: "jinzhu", UpdatedAt: time.Now()}
db.Save(&user3) 

你可以通过将 autoUpdateTime 标签设置为 false 来禁用时间戳跟踪,例如:

type User struct {
  UpdatedAt time.Time `gorm:"autoUpdateTime:false"`
}

注意 GORM 支持多个时间跟踪字段,并支持使用 UNIX(纳秒/毫秒)时间跟踪,详情请参阅 Models。

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…