在参数化查询Postgres中处理空值

时间:2018-12-21 23:33:29

标签: sql postgresql sqlalchemy

我有一个sql查询,我在其中使用sqlalchemy文本函数,因为我有一个相当长且复杂的查询。我想继续讨论一下如何使用复合sql处理它,除非出于某种原因无法解决该问题。

现在,我的一个子查询使用了这样的语法

select * 
from table_a
join table_b on table_a.b_id = table_b.id
join table_c on table_c.b_id = table_b.id
where table_a.timestamp BETWEEN to_date(:time_range_start,'yyyy-mm-dd HH24:MI:SS'::text) and to_date(:time_range_end,'yyyy-mm-dd HH24:MI:SS'::text)
AND table_a.id = ANY(:a_ids)
AND table_a.attribute_id = ANY(:attribute_ids)
AND table_b.id = ANY(:b_ids)

所以我需要了解的是 1.赋予ANY()函数的默认值,以便从本质上使其不过滤 2.一种有条件地将查询的那部分格式化为文本的方法

我可以在调用text()函数之前使用python字符串格式吗?

1 个答案:

答案 0 :(得分:1)

使用直接字符串格式是一个坏主意,那就是注入的发生方式。

也许可以在ANY条件中添加一个布尔值,以便您可以将其强制为TRUE(因此不进行过滤)。例如。

...
AND (:force_a_id OR table_a.id = ANY(:a_ids))
AND (:force_a_attr OR table_a.attribute_id = ANY(:attribute_ids))
...

但是,我真的建议您使用SQLAlchemy的查询API,这完全可以解决它的问题。