2012-07-19 25 views
10

Blog girişleri ve etiketleri arasında çoktan çoğa ilişkisi var. Şimdi belirli bir etiketin kaç tane girdi içerdiğini bilmek istiyorum. Çoktan çoğa ilişkideki satır sayısı (SQLAlchemy)

(basitleştirilmiş) Aşağıdaki modeller düşünün:

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 

Benim yaklaşım bir etiket için girişlerin miktarını saymak len(db_session.query(Tag).get(1).entries) olduğunu. Sorun şu ki, db_session.query(Tag).get(1).entries SQLAlchemy bir etiket için tüm sütunları ile tüm girdileri seçer, ancak girdilerin kendileri değil, yalnızca girişlerin miktarını istiyorum. Bu problem için daha optimal bir yaklaşım var mı?

Teşekkürler.

cevap

15
session.query(Entry).join(Entry.tags).filter(Tag.id==1).count() 

veya bir zaten Etiket

session.query(Entry).with_parent(mytag, "entries").count() 
+4

+1 varsa: ve sık sık bu gerekiyorsa, bir özelliği oluşturabilirsiniz: '@ özelliği \ n def entries_cnt (self): \ n return Session.object_session (self) .query (Giriş) .with_parent (kendiliğinden "girdiler") count() ' – van

+0

Bu yanıt için teşekkürler. Ancak, üretilen SQL deyimi 'SELECT count (*) AS say_1 FROM (SELECT order_line.id AS order_line_id, order_line.order_id AS order_line_order_id FROM order_line NEREDE% (param_1) s = order_line.order_id) AS anon_1' - yerine bir SELECT sayımı (*) order_line WHERE order_line.order_id =% (param_1) s' iç bir SELECT elde ederiz. Benim durumumda, bire çok değil (Siparişte birçok OrderLine var). – guyarad

+0

bir sorguyu (func.count ('*')) önde yapar. [count() belgeler] (http://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=query.count#sqlalchemy.orm.query.Query.count) buna işaret eder. – zzzeek

İlgili konular