GORM使用注意事项
事务
//使用了gorm的事务,作为小程序赞赏时,用户账户扣款,文章获得赞赏,用户账户余额减少。
//添加某个文章某个用户打赏记录
func AddUserPay(articleid, uid int64, amount int) error {
//获取DB
db := GetDB()
// 注意,当你在一个事务中应使用 tx 作为数据库句柄
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
//保证文章id正确
var article Article
err := db.Where("id = ?", articleid).First(&article).Error
if err != nil {
tx.Rollback()
return err
}
// user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
// db.Create(&user)
if err := tx.Create(&Pay{UserID: uid, ArticleID: articleid, Amount: amount}).Error; err != nil {
tx.Rollback()
return err
}
//更新用户账户余额money
//1.首先保证账户存在
// money := Money{UserID: uid}
var money Money
err = db.Where("user_id = ?", uid).First(&money).Error
if err != nil {
tx.Rollback()
return err
}
//2.用户账户余额保证大于0
newamount := money.Amount - amount
if newamount < 0 {
tx.Rollback()
return err
}
//3.账户修改余额
rowsAffected := tx.Model(&money).Update("amount", newamount).RowsAffected
if rowsAffected == 0 {
tx.Rollback()
return nil
}
return tx.Commit().Error
}
Update
WARNING when update with struct, GORM will not update fields that with zero value
当用结构体更新的时候,当结构体字段的值是""或者0,false等,这些字段就不会更新。
如何更新字段值是0,"",false的字段?
① 使用更新所有字段方法(save)
② 使用更新选中字段的方法
③ 使用sql语句方法
常见问题
如何将数据库中的某个字段更新为空
ORM框架自带的update方法无法将某个字段更新为空,变通的做法如下
sql:="update table_name set model_id = null where..."
err:=db.Exec(sql)