Django,Postgres DB,原始查询和有界IN参数

时间:2014-11-14 15:53:34

标签: django postgresql psycopg2 django-orm

我需要运行原始查询,而WHERE子句是IN

select
    o.*,
from
    ff_ooo as o
left join
    ff_ooostatus s on o.id = s.ooo_id
left join
    ff_rrrr r on s.rrrr_id=r.id
where
    o.id in %s
group by
    o.id
having
    r.due_date = max(r.due_date)

我使用

执行它
return list(Ooo.objects.raw(
    sql,
    params=(ooo_ids,)
))

ooo_ids是一个整数数组。

生成的SQL失败并显示以下错误:

  

ProgrammingError:“ARRAY”第13行或附近的语法错误:o.id in   ARRAY [7,8,9,10,11,12,13,14,15,16,17]

我看到Postgres ORM代码正在将IN语句绑定参数转换为ARRAY[]。但是postgres DB不喜欢它。

如何将整数数组正确绑定到Django原始SQL查询中针对postgres数据库的IN子句?

1 个答案:

答案 0 :(得分:0)

而不是list()将参数传递为tuple(),如下所示:

return list(Ooo.objects.raw(
    sql,
    params=(tuple(ooo_ids),)
))