2017-10-17 139 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中進行此查詢?

我在堅持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')) 

,或者如果你想所有的列(如SELECT *),那麼你可以查詢Table代替所映射的實體:

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

在上面,我假設你使用declarative擴展。

+0

麪包車嗨,你anwser幫助我,但我得到了這樣的結果: [(,2),( 0) ,(,0)] 我怎樣才能得到2,0和0內persist.maintenance.maaintener.object導致此: [,(,(]像in_stock_devices是persist.maintenance.Maintener的一個屬性。 –

+0

將擴展答案... – van