我想执行类似这样的查询(使用MySql):
select * from user where id = 5
Ex 1.返回err = sql.ErrNoRows
:
err := db.QueryRow("select * from user where ? = ?", f, v).Scan(&user.Id, etc...)
Ex 2.由于上述方法不起作用,我这样做,虽然有效,但感觉不对:
err := db.QueryRow("select * from user where "+f+" = ?", v).Scan(&user.Id, etc...)
Ex中有什么问题。 1? Ex 2.是否可以接受这种方式?
修改
从评论中的链接我可以做第三种方式。
前3:
q := fmt.Sprintf("select * from user where %s = ?", f)
err := db.QueryRow(q, v).Scan(&user.Id, etc...)
答案 0 :(得分:1)
您需要在sql查询中直接提供列名。 '' sign是您在sql字符串后提供的值的占位符。 你的Ex3。是正确的,但它不是一个好的解决方案,因为它对SQL注入攻击是开放的。
如果您需要轻量级解决方案,您可以为每个表创建一个包含已知列名的地图,例如:userColumns := map[string]bool {"id": true, ...}
,然后使用下一个检查:
if userColumns[f] {
...you able to use f in sql...
} else {
...provided value is not one of known columns, it is an error...
}