ID 作为主键
GORM 默认使用名称为 ID 的字段作为表的主键。
type User struct { ID string // field named `ID` will be used as a primary field by default Name string } |
您可以使用标签primaryKey将其他字段设置为主键
// Set field `UUID` as primary field type Animal struct { ID int64 UUID string `gorm:"primaryKey"` Name string Age int64 } |
另请查看复合主键
复数表名
GORM将struct name复数为snake_cases作为表名,对于struct User,其表名约定为users
表名
您可以通过实现 Tabler 接口来更改默认表名,例如:
type Tabler interface { TableName() string } // TableName overrides the table name used by User to `profiles` func (User) TableName() string { return "profiles" } |
注意 TableName 不允许动态名称,它的结果将被缓存以备将来使用,要使用动态名称,您可以使用 Scopes,例如:
f
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 方法临时指定表名,例如:
// Create table `deleted_users` with struct User's fields db.Table("deleted_users").AutoMigrate(&User{}) // Query data from another table var deletedUsers []User db.Table("deleted_users").Find(&deletedUsers) // SELECT * FROM deleted_users; db.Table("deleted_users").Where("name = ?", "jinzhu").Delete(&User{}) // DELETE FROM deleted_users WHERE name = 'jinzhu';
查看 From SubQuery 了解如何在 FROM 子句中使用 SubQuery
命名策略
GORM 允许用户通过覆盖默认 NamingStrategy 来更改默认命名约定,该命名策略用于构建 TableName、ColumnName、JoinTableName、RelationshipFKName、CheckerName、IndexName,查看 GORM Config 了解详细信息
列名
按照惯例,列 db name 使用字段名称的 snake_case。
type User struct { ID uint // column name is `id` Name string // column name is `name` Birthday time.Time // column name is `birthday` CreatedAt time.Time // column name is `created_at` }
您可以使用标签列覆盖列名或使用 NamingStrategy
type Animal struct { AnimalID int64 `gorm:"column:beast_id"` // set name to `beast_id` Birthday time.Time `gorm:"column:day_of_the_beast"` // set name to `day_of_the_beast` Age int64 `gorm:"column:age_of_the_beast"` // set name to `age_of_the_beast` } |
时间戳跟踪
创建时间
对于具有 CreatedAt 字段的模型,如果该字段的值为零,则该字段将设置为首次创建记录时的当前时间
db.Create(&user) // set `CreatedAt` to current time user2 := User{Name: "jinzhu", CreatedAt: time.Now()} db.Create(&user2) // user2's `CreatedAt` won't be changed // To change its value, you could use `Update` db.Model(&user).Update("CreatedAt", time.Now()) |
您可以通过将 autoCreateTime 标记设置为 false 来禁用时间戳跟踪,例如:
type User struct { CreatedAt time.Time `gorm:"autoCreateTime:false"` } |
更新时间
对于具有 UpdatedAt 字段的模型,如果该字段的值为零,则该字段将设置为更新或创建记录时的当前时间
db.Save(&user) // set `UpdatedAt` to current time db.Model(&user).Update("name", "jinzhu") // will set `UpdatedAt` to current time db.Model(&user).UpdateColumn("name", "jinzhu") // `UpdatedAt` won't be changed user2 := User{Name: "jinzhu", UpdatedAt: time.Now()} db.Create(&user2) // user2's `UpdatedAt` won't be changed when creating user3 := User{Name: "jinzhu", UpdatedAt: time.Now()} db.Save(&user3) // user3's `UpdatedAt` will change to current time when updating |
您可以通过将 autoUpdateTime 标记设置为 false 来禁用时间戳跟踪,例如:
type User struct { UpdatedAt time.Time `gorm:"autoUpdateTime:false"` } |
注意 GORM 支持具有多个时间跟踪字段并使用 UNIX (nano/milli) 秒进行跟踪,查看模型以获取更多详细信息
- 登录 发表评论