渴望加载非单件集合

时间:2011-12-05 22:13:38

标签: python orm group-by sqlalchemy

我想加载重复对象的集合。我的模型看起来像这样:

Item -> Identifier

我想加载(热切地)共享相同标识符的Items集合,但忽略包含一个或更少项目的绝大多数集合。 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 个答案:

答案 0 :(得分:2)

使用子查询,可以实现如下:

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

答案 1 :(得分:0)

这是我最终使用的版本:

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

(标识符现在映射到一个选择,而不是由数据库表支持,这使得导入也更快一些)