具有多个args的Golang数据库/ sql.DB.QueryRow

时间:2017-07-19 14:58:38

标签: mysql database go

我想执行类似这样的查询(使用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...)

1 个答案:

答案 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...
}