Peter Bengtsson:如何在 Django 中使用 raw SQL cursor 操作列表/元组/数组
提供的代码片段使用 Django 的数据库连接执行带有值列表的 SQL 查询。然而,原始代码因 IN 操作符与元组值之间的语法错误而无法运行。错误信息表明 IN 操作符不兼容元组值。该问题特定于 psycopg v3,它要求使用 ANY 操作符而非 IN 操作符。为修复此问题,代码被修改为使用 ANY 操作符,并传递值列表而非元组。在处理字符串列表时,ANY 操作符仍会因数据类型不匹配而引发错误。该错误发生的原因是 ANY 操作符试图将字符串与整数进行比较。为解决此问题,SQL 语句被重写,将每个值作为独立参数处理。这种方法确保每个值得到正确格式化并转义,从而防止潜在的 SQL 注入攻击。修订后的代码使用 f-string 动态生成具有正确参数数量的 SQL 查询,然后将值列表传递给 execute 方法,该方法将 SQL 查询中的占位符替换为实际值。这种方法提供了一种安全且高效地执行带有值列表的 SQL 查询的方式。修订后的代码能够正确处理整数和字符串值,并避免任何潜在的 SQL 注入漏洞。参数化查询的使用确保了无论数据类型如何,值都能得到正确转义和格式化。总体而言,修订后的代码为在 Django 中执行带有值列表的 SQL 查询提供了稳健且安全的解决方案。修订后的代码比原始代码更安全、更高效,并为在 Django 中处理带有动态参数的 SQL 查询提供了良好范例。参数化查询与 ANY 操作符的结合在安全性与性能之间取得了良好平衡,使修订后的代码成为在 Django 中执行带有值列表的 SQL 查询的良好解决方案。