今天遇到比较有意思的事儿:
要使用原生语句进行自加操作。
sql的原生语句为:update projects set likes = (likes + 1) where projectid = xxx
这句是没毛病的,在navicat里可以通过
在代码里 本来打算用gorm的Raw()写:
err = tx.WithContext(ctx).Raw("UPDATE projects SET likes = (likes + 1) WHERE projectid = @projectid ", sql.Named("projectid", 266pphgt57)).Error
但是竟然失败了 这个失败是指 数据库的值并没有更新 而且 并没有报错 !!
通过rowsaffected()看 ,竟然是 0
num := tx.WithContext(ctx).Raw("UPDATE projects SET likes = (likes + 1) WHERE projectid = @projectid ", sql.Named("projectid", 266pphgt57)).RowsAffected
于是打算换用exec()
err = tx.WithContext(ctx).Exec("UPDATE projects SET likes = (likes + 1) WHERE projectid = @projectid ", sql.Named("projectid", 266pphgt57)).Error
完美运行,另外这哥们也遇到了这里
为什么会这样 还不清楚 先记录 待以后研究
gorm坑蛮多的 这个事务的写法不同 还不一样的效果貌似 tx.WithContext(ctx)这个带context的好像是会话模式,突然想起来这个又一次执行和理想结果不一致,于是将WithContext(ctx) 去掉了。具体什么错记不清楚了 突然想到 但是这是个坑 以后抽空好好研究研究-- (2022-11-25 03:11:00)