特点
全功能 ORM
关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承)
Create,Save,Update,Delete,Find 中钩子方法
支持 Preload、Joins 的预加载
事务,嵌套事务,Save Point,Rollback To to Saved Point
Context、预编译模式、DryRun 模式
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
SQL 构建器,Upsert,锁,Optimizer/Index/Comment Hint,命名参数,子查询
复合主键,索引,约束
自动迁移
自定义 Logger
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
每个特性都经过了测试的重重考验
开发者友好
约定(重点)
主键
GORM 使用一个名为ID每个模型的默认主键的字段。
type User struct {
ID string // 默认情况下,名为 ID
的字段会作为表的主键
Name string
}
可以通过标签 primaryKey 将其它字段设为主键
// 将 UUID
设为主键
type Animal struct {
ID int64
UUID string gorm:"primaryKey"
Name string
Age int64
}
表名称
默认情况下,GORM 将结构名称转换为snake_case表名称并将其复数化。例如,一个User结构体出现users在数据库中。
您可以实现 Tabler 接口来更改默认表名,例如:
type Tabler interface {
TableName() string
}
// TableName 会将 User 的表名重写为 profiles
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 方法临时指定表名,例如:
// 根据 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';
列名
GORM 自动将结构体字段名转换为snake_case数据库中的列名。
type User struct {
ID uint // 列名是 id
Name string // 列名是 name
Birthday time.Time // 列名是 birthday
CreatedAt time.Time // 列名是 created_at
}
您可以使用 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
}
你可以通过将 autoCreateTime 标签置为 false 来禁用时间戳追踪,例如:
type User struct {
CreatedAt time.Time gorm:"autoCreateTime:false"
}
时间戳字段
GORM 使用名为CreatedAt和的字段UpdatedAt来自动跟踪记录的创建和更新时间。
对于有 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())
对于有 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
会修改为当前时间
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_62408075/article/details/137268016