在mysql和golang中构建动态查询

时间:2017-06-14 14:46:19

标签: 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)

1 个答案:

答案 0 :(得分:2)

要回答关于如何格式化字符串的问题,简单的答案是使用fmt.Sprintf来构造字符串。 然而 请进一步了解有关使用fmt.Sprintf进行数据库查询的快速说明:

  

Sprintf根据格式说明符进行格式化并返回结果字符串。

示例:

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)

使用此查询,您可以安全地进行注射。话虽如此,您可能会想要修改它并使用db.Exec进行创建/更新/删除。作为一般的经验法则,如果你将db.Exec与fmt.Sprintf一起使用并且不首先清理输入,那么你可以打开自己的SQL注入

GoPlay,简单说明为什么带有db.Exec的fmt.Sprintf不好:
https://play.golang.org/p/-IWyymAg_Q

您应该以适当的方式使用db.Querydb.Prepare来避免这些类型的攻击媒介。您可能需要修改上面的代码示例才能提供一个注入安全的代码段,但希望我能给您足够的开始。