如何根据获得的参数构建动态查询?
这个例子很愚蠢,语法也不对,但你会明白我想要什么。
我想我需要在查询的末尾添加一片变量。
我知道如何用 PHP 实现,但不知道如何用 golang 实现。
db := OpenDB()
defer db.Close()
var filter string
if name != "" {
filter = filter " AND name = ?"
}
if surname != "" {
filter = filter + " AND surname = ?"
}
if address != "" {
filter = filter + " AND address = ?"
}
err = db.Query("SELECT id FROM users WHERE login = ?" +
filter, login)
最佳答案
要回答有关如何格式化字符串的问题,简单的答案是使用 fmt.Sprintf构造你的字符串。 但是请进一步往下查看有关使用 fmt.Sprintf 进行数据库查询的快速说明:
Sprintf formats according to a format specifier and returns the resulting string.
例子:
query := fmt.Sprintf("SELECT id FROM users WHERE login='%s'", login)
err = db.Query(query)
// Equivalent to:
rows, err := db.Query("SELECT id FROM users WHERE login=?", login)
将其用于查询,您就可以免受注入(inject)攻击。话虽如此,您可能会想修改它并使用 db.Exec 进行创建/更新/删除。作为一般的经验法则,如果您将 db.Exec 与 fmt.Sprintf 一起使用并且不先清理您的输入,您就会面临 sql 注入(inject)。
用简单的例子来说明为什么带 db.Exec 的 fmt.Sprintf 不好:
https://play.golang.org/p/-IWyymAg_Q
你应该使用 db.Query或 db.Prepare以适当的方式避免这些类型的攻击媒介。您可能需要修改上面的代码示例才能得到一个注入(inject)安全的代码段,但希望我已经给了您足够的信息让您开始。
关于mysql - 在 mysql 和 golang 中构建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548030/