编程小白

编程小白

go orm使用指南

默认分类 0 评

特点
全功能 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