我想加载重复对象的集合。我的模型看起来像这样:
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)
答案 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
(标识符现在映射到一个选择,而不是由数据库表支持,这使得导入也更快一些)