使用 ID 作为主键 默认情况下,GORM 会使用 ID 作为表的主键。
1 2 3 4 type User struct { ID string Name string }
你可以通过标签 primaryKey 将其它字段设为主键
1 2 3 4 5 6 7 type Animal struct { ID int64 UUID string `gorm:"primaryKey"` Name string Age int64 }
此外,您还可以看看 复合主键
复数表名 GORM 使用结构体名的 蛇形命名 作为表名。对于结构体 User,根据约定,其表名为 users
TableName 您可以实现 Tabler 接口来更改默认表名,例如:
1 2 3 4 5 6 7 8 type Tabler interface { TableName() string }func (User) TableName () string { return "profiles" }
注意: TableName 不支持动态变化,它会被缓存下来以便后续使用。想要使用动态表名,你可以使用 Scopes,例如:
1 2 3 4 5 6 7 8 9 10 11 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 方法临时指定表名,例如:
1 2 3 4 5 6 7 8 9 10 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 子查询 了解如何在 FROM 子句中使用子查询
命名策略 GORM allows users to change the default naming conventions by overriding the default NamingStrategy, which is used to build TableName, ColumnName, JoinTableName, RelationshipFKName, CheckerName, IndexName, Check out GORM Config for details
列名 根据约定,数据表的列名使用的是 struct 字段名的 蛇形命名
1 2 3 4 5 6 type User struct { ID uint Name string Birthday time.Time CreatedAt time.Time }
您可以使用 column 标签或 命名策略 来覆盖列名
1 2 3 4 5 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 字段的模型,创建记录时,如果该字段值为零值,则将该字段的值设为当前时间
1 2 3 4 5 6 7 db.Create(&user) user2 := User{Name: "jinzhu" , CreatedAt: time.Now()} db.Create(&user2) db.Model(&user).Update("CreatedAt" , time.Now())
你可以通过将 autoCreateTime 标签置为 false 来禁用时间戳追踪,例如:
1 2 3 type User struct { CreatedAt time.Time `gorm:"autoCreateTime:false"` }
UpdatedAt 对于有 UpdatedAt 字段的模型,更新记录时,将该字段的值设为当前时间。创建记录时,如果该字段值为零值,则将该字段的值设为当前时间
1 2 3 4 5 6 7 8 9 10 11 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 来禁用时间戳追踪,例如:
1 2 3 type User struct { UpdatedAt time.Time `gorm:"autoUpdateTime:false"` }
注意 GORM 支持拥有多种类型的时间追踪字段。可以根据 UNIX(毫/纳)秒,查看 Model 获取详情