mysql - 在 mysql 和 golang 中构建动态查询

标签 mysql go

如何根据获得的参数构建动态查询?

这个例子很愚蠢,语法也不对,但你会明白我想要什么。

我想我需要在查询的末尾添加一片变量。

我知道如何用 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.Querydb.Prepare以适当的方式避免这些类型的攻击媒介。您可能需要修改上面的代码示例才能得到一个注入(inject)安全的代码段,但希望我已经给了您足够的信息让您开始。

关于mysql - 在 mysql 和 golang 中构建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548030/

相关文章:

firebase - 需要Docker Firestore项目ID

multithreading - 与 goroutine 并行运行代码的首选语法是什么?

c - 如何使用 Cgo 访问 MATLAB 数组中的值?

php - SQL 更新不工作?

php - 重复过程直到满足条件

Mysql, 树, 分层查询, 性能

gorm exec 使用原始 sql 从插入事务返回 ID

php - 明智地显示或隐藏内容用户角色

PHP/MySQL 计数 (*) 并在 html 中使用 var

Golang for 循环添加不一致的 i++