2014-11-14 38 views
0

我需要运行一个原始查询并且WHERE子句是一个INDjango,Postgres DB,原始查询和有界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: syntax error at or near "ARRAY" LINE 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

PostgreSQL的这个答案应该有所帮助:http://stackoverflow.com/a/22008870/3246440 – 2014-11-14 15:57:51

+0

[路过列表或元组作为可能的重复参数在Django的原始SQL](http://stackoverflow.com/questions/6895051/passing-lists-or-tuples-as-arguments-in-django-raw-sql) – 2014-11-14 16:10:50

回答

0

而不是list()通参数tuple()这样的:

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