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)