Python 查询以检查在SQLAlchemy中集合的大小是0还是空?

Python 查询以检查在SQLAlchemy中集合的大小是0还是空?,python,sqlalchemy,flask,Python,Sqlalchemy,Flask,个人有一个建筑 人有许多群体 我想返回某个建筑中所有组集合中没有任何组的人员。也许我可以按组列表长度为0的人员进行搜索? 比如: unassigned=Person.query.filter(Person.building==g.current_building,Person.groups.any()).all() 将否定(~)用于: any在您的案例中比需要的功能更强大,但它可以很好地完成工作。首先计算每个建筑的组数,然后根据该数进行过滤 gc = session.query( Pe

个人
有一个
建筑

有许多
群体

我想返回某个
建筑
中所有
集合中没有任何
人员。
也许我可以按组列表长度为0的人员进行搜索? 比如:

unassigned=Person.query.filter(Person.building==g.current_building,Person.groups.any()).all()
将否定(
~
)用于:


any
在您的案例中比需要的功能更强大,但它可以很好地完成工作。

首先计算每个建筑的组数,然后根据该数进行过滤

gc = session.query(
    Person.id,
    db.func.count(Group.id).label('gc')
).join(Person.groups).group_by(Person.id).subquery()

unassigned = session.query(Person).join(
    (gc, gc.c.person_id == Person.id)
).filter(
    Person.building == g.current_building,
    gc.c.gc == 0
).all()

如果需要知道查询后关系是否有记录,请对关系使用
count()
方法:

persons = session.query(Person).filter(Person.building == g.current_building).all()
for p in persons:
    if p.groups.count():
        print("%s have groups" % p)

这种“昂贵”是因为any的强大功能吗?我不认为它会很昂贵,但通常情况下是这样的:这取决于:它可能比其他解决方案更快或更慢,这取决于您的数据密度、现有的数据库索引,当然还有RDBMS本身
any
将生成一个子查询,虽然它不是SQL的“好”部分,但这就是SA对用户隐藏的内容。在5Gb sqlite数据库上,使用外部联接的速度是
any()
版本的100多倍(我没有等待
any()
的速度).outerjoin(句子).filter(句子.id==None)
persons = session.query(Person).filter(Person.building == g.current_building).all()
for p in persons:
    if p.groups.count():
        print("%s have groups" % p)