10
ブログエントリとタグの間に多対多の関係があります。今、私は特定のタグが持つエントリの数を知りたいと思います。 多対多関係の行数をカウントする(SQLAlchemy)
(簡体)次のモデルを想像してみて:rel_entries_tags = Table('rel_entries_tags', Base.metadata,
Column('entry_id', Integer, ForeignKey('entries.id')),
Column('tag_id', Integer, ForeignKey('tags.id'))
)
class Entry(Base):
__tablename__ = 'entries'
id = Column(Integer, primary_key=True)
title = Column(String(80))
text = Column(Text)
tags = relationship('Tag', secondary=rel_entries_tags, backref=backref('entries'))
def __init__(self, title, text):
self.title = title
self.text = text
self.tags = tags
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True, nullable=False)
def __init__(self, name):
self.name = name
私のアプローチを、タグのエントリの量をカウントするlen(db_session.query(Tag).get(1).entries)
です。問題は、db_session.query(Tag).get(1).entries
をSQLAlchemyが取得したときに、タグのすべての列を含むすべてのエントリを選択するということです。ただし、エントリ自体ではなく、エントリの量だけを必要とします。この問題の最適なアプローチはありますか?
ありがとうございました。
1を持っている場合:あなたは、多くの場合、これを必要とする場合、あなたがプロパティを作成することができます: '@propertyの\ nを デフentries_cnt(自己):\ nはcount() ' – van
この回答に感謝します。しかし、生成されたSQLステートメントは 'SELECT count(*)AS count_1 FROM(SELECT order_line.id AS order_line_id、order_line.order_id AS order_line_order_id FROM order_line WHERE%(param_1)s = order_line.order_id)AS an_1_1 つまり、 - 1つの 'SELECT count(*)FROM order_line WHERE order_line.order_id =%(param_1)s'の代わりに、内部SELECTを取得します。 私の場合、1対多ではありません(Orderには多くのOrderLineがあります)。 – guyarad
クエリを実行します(func.count( '*'))。 [count()ドキュメント](http://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=query.count#sqlalchemy.orm.query.Query.count)はこれを参照しています。 – zzzeek