2017-10-17 3 views
0
SELECT 
    maintener.*, 
    (SELECT COUNT(*) 
    FROM device d 
    WHERE d.in_stock_maintener_id = maintener.id) AS in_stock_devices 
FROM maintener; 

すべてのメインテナを表示するレポートを作成していますが、デバイスモデルのリファレンスin_stock_maintener_idを見て、各メインテナが持つデバイスの数を表示する必要があります。sqlalchemyでこのクエリを作成する方法は?

私はこのモデルを私のpersist sqlalchemyに持っています。

class Maintener(persist.Base): 
    __tablename__ = 'maintener' 

     id = Column(Integer, primary_key=True) 
     name = Column(String(255)) 
     document_number = Column(String(30)) 
     phone_1 = Column(String(12)) 
     phone_2 = Column(String(12)) 
     email = Column(String(255)) 




class Device(persist.Base): 

    __tablename__ = 'device' 

     id = Column(Integer, primary_key=True) 
     serial = Column(String(45)) 
     in_stock = Column(SmallInteger) 
     in_stock_maintener_id = Column(ForeignKey(u'maintener.id'), nullable=True, index=True) 

    in_stock_maintener = relationship(u'Maintener', lazy='noload', \ 
     primaryjoin='Device.in_stock_maintener_id == Maintener.id') 

誰も私を助けることができれば、私は=感謝するでしょう)

答えて

1
sq = (
    session 
    .query(func.count()) 
    .select_from(Device) 
    .filter(Device.in_stock_maintener_id == Maintener.id) 
).as_scalar() 

q = session.query(Maintener, sq.label('in_stock_devices')) 

上記のクエリはtuple(Maintener, Integer)の列挙を返します。

あなたは(あなたのコメントのとおり)、その後、あなたは暗黙的にクエリにしたい列を指定するか、代わりに列を持っているしたい場合:(

q = session.query(Maintener.id, Maintener.name, sq.label('in_stock_devices')) 

をしたり、すべての列を希望の場合のように、私はあなたがdeclarative拡張子を使用することを想定の上に

q = session.query(Maintener.__table__, sq.label('in_stock_devices')) 

SELECT *)、その後、あなたの代わりにマップされたエンティティのTableを問い合わせることができます。

+0

こんにちはバン、あなたのanwserは私を助けて、しかし、私はこの結果を得た: [(、2)、(<0x7f89c48f92e8でpersist.maintenance.Maintenerオブジェクト>、0) [ 0)] 0x7f89c48f9278>、(、()のようにin_stock_devicesはpersist.maintenance.Maintenerの1つの属性です –

+0

答えを拡張します... – van

関連する問題