фильтрация и группировка таблиц левого объединения

#python #postgresql #ponyorm

Вопрос:

Я бы хотел сделать такой запрос:

 select t1.label, count(t2.id) 
from t1 left join t2 
    on t1.id = t2.fk [and t2.field_1 = 'x' and ...] 
[where t1.field_a =  'y' and ...] 
group by t1.label;
 

Моей первой попыткой было сделать

 sub_query = pony.orm.select(x for x in t2)
apply_sub_filter(sub_query, ...)
query = pony.orm.select((y.label, pony.orm.count(sub_query)) for y in t1)
apply_filter(query, ...)
 

Это не работает (даже при удалении фильтров)

Согласно 4 — му примеру в этом документе поддерживается повторное использование запросов, поэтому я предположил, что количество-это то, что здесь отключено.

Это работает, когда все это помещается в один select()

 pony.orm.select(y.label, pony.orm.count(x for x in t2 if x.fk == y.id [and ...]) for x in t1 [if ....])
 

это работает, как и ожидалось, но он жестко кодирует оба набора фильтров, и мне нужно, чтобы они были динамичными.

Я мог бы написать все возможные комбинации фильтров и выбрать, какой запрос запускать, основываясь на фильтре, который я получаю во время выполнения, но я думаю, что все согласятся, что это противоречит цели использования ORM

В качестве примечания: В документации говорится, что выполнение такого рода подзапросов (как в последнем примере) будет оптимизировано с помощью ponyorm в качестве левого соединения, но когда я наблюдаю, какие запросы выполняются в базе данных, левого соединения нет, только подзапросы, что, вероятно, будет очень медленным для больших наборов данных.

Как я могу заставить это работать ? Позже мне также понадобится поддержка разбиения на страницы.

Есть ли шанс оптимизировать это, чтобы ponyorm использовал левое соединение вместо подзапросов ?