[英]SqlAlchemy query and filter by number of relationships
所以目前我有兩個班級Foo
和Bar
在哪里
class Foo(db.Model):
...
bars = db.relationship('Bar', backref='foo', lazy='dynamic')
...
在這里,一個Foo
可以有多個Bar
。 如何查詢Foo
以便我可以按Bar
的數量進行過濾? 類似Foo.query.filter(Foo.bars.count() == x).first()
除了保持計數變量之外,還有其他方法可以做到這一點嗎?
這個 SQL 查詢將是一種方法(假設 x = 2):
SELECT parent.id, COUNT(child.tid) AS num_bars
FROM parent
JOIN child ON parent.id = child.tid
GROUP BY parent.id
HAVING COUNT(child.tid) = 2;
這將轉化為(sqlalchemy):
import sqlalchemy as sa
x = 2
q = (session.query(Foo, sa.func.count(Bar.foo_id).label('num_bars'))
.join(Bar)
.group_by(Foo.id)
.having(sa.literal_column('num_bars') == x)
.from_self(Foo))
flask-sqlalchemy 的等價物可能是
q = (db.session.query(Foo, sa.func.count(Bar.foo_id).label('num_bars'))
.join(Bar)
.group_by(Foo.id)
.having(sa.literal_column('num_bars') >= x)
.from_self(Foo))
另一種方法是使用子查詢:
SELECT parent.id
FROM parent
WHERE (SELECT COUNT(1)
FROM child
WHERE child.tid = parent.id
) = 2
使用 SQLAlchemy 看起來像這樣:
subq = (session.query(sa.func.count(Bar.foo_id))
.filter(Bar.foo_id == Foo.id)
.scalar_subquery())
q = session.query(Foo).filter(subq == 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.