在 Go 中有效地制作 SQL 查询
在 Go 中将字符串与文本 SQL 查询中的值连接起来可能有点棘手。与 Python 不同,Go 的字符串格式化语法行为不同,导致常见错误,如此处遇到的错误。
元组语法错误
初始代码片段尝试使用 Python -style 元组,Go 中不支持。这会导致语法错误:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
(val1, val2))
类型不匹配
由于类型不匹配,尝试将元组元素转换为字符串也会失败:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
val1, val2)
避免运算符不匹配
将参数转换为字符串并将它们与运算符 %s 连接起来可以,但不建议这样做。这种方法引入了运算符不匹配的风险:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %s AND column2_name = %s`,
strconv.Itoa(val1), val2)
Go 解决方案
要在 Go 中正确编写带有值串联的文本 SQL 查询,请使用 fmt.Sprintf,如下所示:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %s`,
val1, val2)
此语法可避免注入漏洞并确保正确的类型转换。
注入预防
要防止 SQL 注入攻击,请始终使用准备好的语句或为用户提供的输入提供转义字符。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3