Стремительная загрузка не-одиночных коллекций - PullRequest
1 голос
/ 06 декабря 2011

Я хотел бы загрузить коллекции повторяющихся объектов.Моя модель выглядит следующим образом:

Item -> Identifier

Я хотел бы (с нетерпением) загрузить коллекции Предметов, которые имеют один и тот же Идентификатор, но игнорируют подавляющее большинство коллекций, которые содержат один элемент или меньше.Отношения ORM устанавливаются в обоих направлениях (Identifier.items и Item.identifier).SQL должен выглядеть примерно так:

SELECT * FROM Item WHERE identifier_id IN (
    SELECT identifier_id FROM Item GROUP BY identifier_id HAVING COUNT(*) > 1)

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Используя подзапрос, это может быть достигнуто следующим образом:

q = (select([Item.identifier_id, func.count(Item.id).label("cnt")]).
     group_by(Item.identifier_id).having(func.count(Item.id)>1)).alias("subq")
qry =  (session.query(Item).join(q, Item.identifier_id==q.c.identifier_id))
print qry # prints SQL statement generated
items = qry.all() # result
0 голосов
/ 06 декабря 2011

Вот версия, которую я наконец-то использую:

from sqlalchemy.sql.functions import count
from sqlalchemy.orm import subqueryload
# …

repeats = (
    select(
        (Item.identifier,
        count(Item.identifier)))
    .group_by(Item.identifier)
    .having(count(Item.identifier) > 1)
    .alias())
for identifier in (
    sess.query(Identifier)
        .join(repeats, repeats.c.identifier==Identifier.value)
        .options(subqueryload(Identifier.items))
):
    for item in identifier.items:
        pass

(Идентификатор теперь сопоставляется с выбором и не поддерживается таблицей базы данных, что также делает импорт немного быстрее)

...