Обработка нулей в параметризованных запросах postgres - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть 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 перед вызовом для него функции text ()?

1 Ответ

0 голосов
/ 22 декабря 2018

Использование прямого формата строки - плохая идея, так происходит инъекция.

Возможно, добавьте логическое значение к условиям 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))
...

Тем не менее, я бы действительно рекомендовал использовать API запросов SQLAlchemy, это вполне соответствует тому решению, которое он решает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...