GORM

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值