Describe the feature
张⾦柱大佬好,自学小白一枚,看了半天,搜了半天也没理解为何 ? (就是where("name = ?",name)) 除了int一定要给加单引号。是为了防止注入?
我的情况是这样的,一个更改状态的语句(没找到gorm对sql函数的解决办法,只能原生了)
tId := 获取好的ID (int类型)
tTable := 获取好的表名(string类型)
tField := 获取好的字段名(string类型)
err = models.DB.Exec("UPDATE ? SET ?=ABS(?-1) WHERE id=?", tTable, tField, tField, tId).Error
期望是:
UPDATE focus SET status=ABS(status-1) WHERE id=6
结果却是(无法执行的SQL,就是多了很多单引号)
UPDATE 'focus' SET 'status'=ABS('status'-1) WHERE id=6
最后我只能这样解决
err = models.DB.Exec("UPDATE "+tTable+" SET "+tField+"=ABS("+tField+"-1) WHERE id=?", tId).Error
Motivation
请原谅本人才疏学浅 1、对sql函数的解决办法,只能原生了对吧? 2、有没有一种可能,不来回拼接,让?或者加个其他特殊符号让它原样输出不加引号?比如,设计2个?? 代表原样输出
err = models.DB.Exec("UPDATE ?? SET ??=ABS(??-1) WHERE id=?", tTable, tField, tField, tId).Error
达到
UPDATE focus SET status=ABS(status-1) WHERE id=6
的效果,而不是一顿的 "SQL"+xx+"SQL"+xx+"SQL"+xx+"SQL"+xx+"SQL",这种拼接的事不该电脑做么?一点也不优雅
最后表达下对大佬的敬仰,Gorm 是最棒的!
Related Issues
Comment From: zhangbest5
找到一种优美的写法,分享下
sqlQuery := fmt.Sprintf("UPDATE %s SET %s=ABS(%s-1) WHERE id=%d", tTable, tField, tField, tId)
err = models.DB.Exec(sqlQuery).Error
Comment From: alresvor
gorm.Expr() 可以保持字符串原样,不被转义
Comment From: zhangbest5
gorm.Expr() 可以保持字符串原样,不被转义
非常感谢,我试试