ID
默认情况下,GORM 会使用 ID 作为表的主键。
type User struct { ID string // 默认情况下,名为 `ID` 的字段会作为表的主键 Name string }
你可以通过标签 primaryKey 将其它字段设为主键
primaryKey
// 将 `UUID` 设为主键 type Animal struct { ID int64 UUID string `gorm:"primaryKey"` Name string Age int64 }
此外,您还可以看看 复合主键
GORM 使用结构体名的 蛇形命名 作为表名。对于结构体 User,根据约定,其表名为 users
蛇形命名
User
users
您可以实现 Tabler 接口来更改默认表名,例如:
Tabler
type Tabler interface { TableName() string } // TableName 会将 User 的表名重写为 `profiles` func (User) TableName() string { return "profiles" }
{% note warn %} 注意: TableName 不支持动态变化,它会被缓存下来以便后续使用。想要使用动态表名,你可以使用 Scopes,例如: {% endnote %}
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 方法临时指定表名,例如:
Table
// 根据 User 的字段创建 `deleted_users` 表 db.Table("deleted_users").AutoMigrate(&User{}) // 从另一张表查询数据 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 子查询 了解如何在 FROM 子句中使用子查询
GORM 允许用户通过覆盖默认的命名策略更改默认的命名约定,命名策略被用于构建: TableName、ColumnName、JoinTableName、RelationshipFKName、CheckerName、IndexName。查看 GORM 配置 获取详情
命名策略
ColumnName
JoinTableName
RelationshipFKName
CheckerName
IndexName
根据约定,数据表的列名使用的是 struct 字段名的 蛇形命名
type User struct { ID uint // 列名是 `id` Name string // 列名是 `name` Birthday time.Time // 列名是 `birthday` CreatedAt time.Time // 列名是 `created_at` }
您可以使用 column 标签或 命名策略 来覆盖列名
column
type Animal struct { AnimalID int64 `gorm:"column:beast_id"` // 将列名设为 `beast_id` Birthday time.Time `gorm:"column:day_of_the_beast"` // 将列名设为 `day_of_the_beast` Age int64 `gorm:"column:age_of_the_beast"` // 将列名设为 `age_of_the_beast` }
对于有 CreatedAt 字段的模型,创建记录时,如果该字段值为零值,则将该字段的值设为当前时间
CreatedAt
db.Create(&user) // 将 `CreatedAt` 设为当前时间 user2 := User{Name: "jinzhu", CreatedAt: time.Now()} db.Create(&user2) // user2 的 `CreatedAt` 不会被修改 // 想要修改该值,您可以使用 `Update` db.Model(&user).Update("CreatedAt", time.Now())
你可以通过将 autoCreateTime 标签置为 false 来禁用时间戳追踪,例如:
autoCreateTime
false
type User struct { CreatedAt time.Time `gorm:"autoCreateTime:false"` }
对于有 UpdatedAt 字段的模型,更新记录时,将该字段的值设为当前时间。创建记录时,如果该字段值为零值,则将该字段的值设为当前时间
UpdatedAt
db.Save(&user) // 将 `UpdatedAt` 设为当前时间 db.Model(&user).Update("name", "jinzhu") // 会将 `UpdatedAt` 设为当前时间 db.Model(&user).UpdateColumn("name", "jinzhu") // `UpdatedAt` 不会被修改 user2 := User{Name: "jinzhu", UpdatedAt: time.Now()} db.Create(&user2) // 创建记录时,user2 的 `UpdatedAt` 不会被修改 user3 := User{Name: "jinzhu", UpdatedAt: time.Now()} db.Save(&user3) // 更新时,user3 的 `UpdatedAt` 会修改为当前时间
你可以通过将 autoUpdateTime 标签置为 false 来禁用时间戳追踪,例如:
autoUpdateTime
type User struct { UpdatedAt time.Time `gorm:"autoUpdateTime:false"` }
{% note %} 注意 GORM 支持拥有多种类型的时间追踪字段。可以根据 UNIX(毫/纳)秒,查看 Model 获取详情 {% endnote %}
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8