我有一个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字符串格式吗?
答案 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,这完全可以解决它的问题。