gorose
gorose copied to clipboard
说一个update和delete的问题
//正确的不出问题的写法 if len(MemberModel.Api_find(project["id"], user)) > 0 { MemberModel.Api_update(project["id"], user, rid) } else { if MemberModel.Api_insert(project["id"], user, rid) { c.JSON(200, RET.Ret_succ(0, "registration_id新建完毕")) } else { c.JSON(200, RET.Ret_succ(500, "registration_id同步失败")) } }
//会出问题的版本 if MemberModel.Api_update(project["id"], user, rid) { c.JSON(200, RET.Ret_succ(0, "registration_id更新完毕")) } else { if MemberModel.Api_insert(project["id"], user, rid) { c.JSON(200, RET.Ret_succ(0, "registration_id新建完毕")) } else { c.JSON(200, RET.Ret_succ(500, "registration_id同步失败")) } }
说下需求,就是对已经存在的数据进行更新,不存在的进行新建处理
func Api_update(pid, user, rid interface{}) bool { db := tuuz.Db().Table(table) where := map[string]interface{}{ "pid": pid, "user": user, } db.Where(where) data := map[string]interface{}{ "rid": rid, "date": time.Now().Unix(), } db.Data(data) _, err := db.Update() if err != nil { Log.Dbrr(err, tuuz.FUNCTION_ALL()) return false } else { return true } }
这是update代码,问题是如果update的方法例如where的数据没找到,或者不正确,是不会触发err的,这个时候就非常麻烦,必须要用find方法先找然后在确定是update还是insert方法
那么现在如果直接用if api_update的方法直接进行判断的话,那么就会变成数据即使不存在也会update,并且不会触发err,也就不会触发insert方法
这个问题已经在群里说过了,希望能处理一下,避免出现问题吧……可能是mysql的connect升级了导致的问题
@fizzday
这个问题, 实际上是mysql自己的问题:
mysql> select * from users;
+-----+---------+-----+
| uid | uname | age |
+-----+---------+-----+
| 1 | gorose | 20 |
| 2 | gorose2 | 19 |
+-----+---------+-----+
2 rows in set (0.00 sec)
mysql> UPDATE users SET age = 22 WHERE `uid` = 11;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql>
影响行数是0, 但是不会报错.
所以, 这个可以使用 affected rows 来判定.
orm本身如果用affected rows自动判定的话, 可能就有问题了, 因为, 无法orm无法确定是条件错误, 还是数据重复, 亦或是其他问题
@tobycroft 我查了下, 这个不仅仅是mysql, 而是大部分数据库都是这个准则, 他是判定sql语法的, 语法正确就不报错, 所以搞了个影响行数