如何在Django原生SQL中传递整数列表参数(不使用字符串格式化)
Django原生SQL传递整数列表参数(无f-string参数格式化方案)
适配PostgreSQL的ANY数组参数法
直接将整数列表作为单个参数传入,利用PostgreSQL对数组类型的原生支持,无需字符串处理:
from django.db import connection id_list = [1,2,3,4,5] sql = """ SELECT * FROM your_table WHERE id = ANY(%s) """ with connection.cursor() as cursor: cursor.execute(sql, (id_list,)) results = cursor.fetchall()
Django会自动将列表转换为PostgreSQL可识别的数组类型,避免参数被包裹成字符串。
通用数据库的动态占位符法
通过生成对应数量的%s占位符,再将列表拆分为参数传入,仅用f-string拼接占位符而非参数值,完全规避SQL注入风险:
from django.db import connection id_list = [1,2,3,4,5] # 生成与列表长度匹配的占位符 placeholders = ", ".join(["%s"] * len(id_list)) sql = f""" SELECT * FROM your_table WHERE id IN ({placeholders}) """ with connection.cursor() as cursor: cursor.execute(sql, id_list) results = cursor.fetchall()
需注解场景的半ORM方案
如果要保留注解逻辑但无法全用ORM,可结合RawSQL和Func生成数组参数:
from django.db.models import Func, RawSQL from your_app.models import YourModel id_list = [1,2,3,4,5] queryset = YourModel.objects.annotate( is_target=RawSQL("id = ANY(%s)", (Func(id_list, function='ARRAY'),)) ).filter(is_target=True)
之前尝试失败的原因
- 传入元组到
IN语句时,Django将整个元组视为单个字符串参数,导致被单引号包裹,触发SQL语法错误。 - 使用
ANY时若手动将列表转为字符串传入,会被识别为普通文本而非数组,引发数组格式错误。
内容的提问来源于stack exchange,提问作者Teamata Leoneos
相关产品推荐
相关产品推荐

