gpt4 book ai didi

mysql - 具有多个参数的 Golang 数据库/sql.DB.QueryRow

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:14 25 4
gpt4 key购买 nike

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

最佳答案

您需要在 sql 查询中直接提供列名。 “?”符号是您在 sql 字符串之后提供的值的占位符。你的 Ex3。是正确的,但这不是一个好的解决方案,因为它对 SQL 注入(inject)攻击是开放的。

如果您需要一个轻量级的解决方案,您可以为每个表创建一个具有已知列名的映射,例如: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...
}

关于mysql - 具有多个参数的 Golang 数据库/sql.DB.QueryRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45194312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com