在 Go 中有效地编写 SQL 查询
在 Go 中将字符串与文本 SQL 查询中的值连接起来可能有点棘手。与 Python 不同,Go 的字符串格式化语法行为不同,导致常见错误,如此处遇到的错误。
元组语法错误
初始代码片段尝试使用 Python -style 元组,Go 中不支持。这会导致语法错误:
<code class="go">query := fmt.Sprintf(`SELECT column_name FROM table_name WHERE column1_name = %d AND column2_name = %d`, (val1, val2))</code>
类型不匹配
尝试将元组元素转换为字符串也会因类型不匹配而失败:
<code class="go">query := fmt.Sprintf(`SELECT column_name FROM table_name WHERE column1_name = %d AND column2_name = %d`, val1, val2)</code>
避免运算符不匹配
将参数转换为字符串并将它们与运算符 %s 连接起来可以,但不建议这样做。这种方法引入了运算符不匹配的风险:
<code class="go">query := fmt.Sprintf(`SELECT column_name FROM table_name WHERE column1_name = %s AND column2_name = %s`, strconv.Itoa(val1), val2)</code>
Go 解决方案
要在 Go 中正确编写带有值串联的文本 SQL 查询,请使用 fmt.Sprintf如下所示:
<code class="go">query := fmt.Sprintf(`SELECT column_name FROM table_name WHERE column1_name = %d AND column2_name = %s`, val1, val2)</code>
此语法可以避免注入漏洞并确保正确的类型转换。
注入预防
要防止 SQL 注入攻击,请始终使用准备好的语句或为用户提供的输入提供转义字符。
以上是如何使用 Go 在 SQL 查询中有效连接字符串和值?的详细内容。更多信息请关注PHP中文网其他相关文章!