簡體   English   中英

SqlAlchemy 按關系數查詢過濾

[英]SqlAlchemy query and filter by number of relationships

所以目前我有兩個班級FooBar在哪里

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM