这是我参与「第五届青训营 」伴学笔记创作活动的第12天
更新数据
更新所有字段: 例如db.Save(&user) 即使是零值也会更新
更新单列: 例如db.Model(&user).Update("user_name", "jinzhu2") ,db.Model(&User{}).Where("user_name", "jinzhu1").Update("user_name", "jinzhu2")
更新多列: 使用Updates方法,当更新条件时struct时,零值不会更新,如果需要更新零值可以使用Map更新或使用Select选择字段
db.Model(&user).Updates(map[string]interface{}{"user_name":"jinzhu2","age":30});
db.Model(&user).Updates(User{Name:"jinzhu1",Age:20});
更新选定字段: 使用Select和Omit方法
db.Model(&user).Select("name").Updates(map[string]interface{}{"name":"jinzhu","age":10,"acitive":true});
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name":"jinzhu","age":10,"acitive":true});
删除数据
软删除: 如果model中有DeletedAt字段,那么该模型在调用Delete时,记录不会从数据库中真正删除,GORM而是将DeletedAt置为当前时间,并且在查询时会被忽略
db.Delete(&user);
// 批量删除
db.Where("age =?",20).Delete(&user);
//软删除的记录将在查询时被忽略
db.Where("age = 20").Find(&user)
// 使用Unscoped查找软删除的记录
db.Unscoped().Where("age=?",20).Find(&user);
// 使用Unscoped永久删除记录
db.Unscoped().Delete(&user);
事务
- GORM提供了Begin,Commit,Rollback方法用于事务
- GORM提供了Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollback
- 可以使用SkipDefaultTransaction关闭默认事务,提高性能
Hook
Hook可以在创建、查询、更新和删除之前或之后自动执行某些逻辑,如果任何Hook返回错误,GORM将停止后续的操作并且回滚事务
创建: BeforeCreate、AfterCreate 、BeforeSave、AfterSave
更新: BeforeUpdate、AfterUpdate、BeforeSave、AfterSave
查询: AfterFind
删除: BeforeDelete、AfterDelete
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.RecordID = uuid.New().String()
fmt.Println("创建 User 开始,UUID 为:", u.RecordID)
return nil
}
func (u *User) AfterCreate(tx *gorm.DB) error {
fmt.Println("创建 User 完毕,ID 为:", u.ID)
return nil
}
Kitex
服务默认监听8888端口,rpc框架
IDL
通过定义的IDL来编写服务接口,实现服务端和客户端的通信
生成代码
使用kitex -module "mod_name" -service a.b.c hello.thrift命令