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() 可以保持字符串原样,不被转义

非常感谢,我试试