You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:55:59