使用 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 获取详情