为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中编写文本 SQL 查询的正确方法

在 Go 中编写文本 SQL 查询的正确方法

Go
桃花长相依 2021-12-27 15:02:10
我找不到一个很好的例子来说明将文本查询的字符串部分与值连接起来的正确方法。例如:query := `SELECT column_name FROM table_name        WHERE column1_name = %d AND column2_name = %d` % (val1, val2)rows, res, err := db.Query(query)这不起作用。编译器syntax error: unexpected comma, expecting ) 可能返回,因为我正在尝试使用 python 样式的元组。如果我将其重写为query := `SELECT column_name FROM table_name        WHERE column1_name = %d AND column2_name = %d` % val1我得到(mismatched types string and int)它告诉我元组是问题之一。如果我首先将参数转换为字符串,我会得到 (operator % not defined on string)在 python 中,你会做类似的事情query = """SELECT column_name FROM table_name    WHERE column1_name = %d    AND column2_name = %d""" % (val1, val2)或者query = """SELECT column_name FROM table_name    WHERE column1_name = %s    AND column2_name = %s""" % (val1_string, val2_string)我知道我可以将值转换为字符串并使用 连接"STRING" + var + "STRING",但与 python 版本相比,这似乎非常混乱。Go 中 Python 代码的等价物是什么?具体包括元组部分,并连接一个字符串和一个整数。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

< 由于注入漏洞而对 SQL 语句使用字符串插值的标准警告 >


你可以用它fmt.Sprintf来处理这个。


query := fmt.Sprintf(`SELECT columnA FROM tableA WHERE columnB = %d AND columnB = %s`,

                     someNumber, someString)

为避免注入问题,请将您的第一个代码编写为:


query := `SELECT column_name FROM table_name

    WHERE column1_name = %d AND column2_name = %d`


rows, err := db.Query(query, val1, val2)


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信