2017-10-17 3 views
0

Ich erstelle einen Bericht, der alle mainteners zeigt, aber ich muss die Anzahl der Geräte anzeigen, die jeder dieser mainteners hat, indem ich die Gerätemodellreferenz in_stock_maintener_id ansehe;Wie man diese Abfrage in sqlalchemy macht?

Ich habe diese Modelle in meinem persistenten 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') 

Wenn jemand mir helfen könnte, werde ich dankbar sein =)

Antwort

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')) 

Abfrage oben wird eine zählbare von tuple(Maintener, Integer) zurückzukehren.

Wenn würden Sie Spalten wie stattdessen haben (wie pro Ihren Kommentar), dann können Sie entweder die Spalten geben Sie in der Abfrage wollen implizit:

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

oder wenn Sie alle Spalten möchten (wie in SELECT *), dann könnte man die Table Abfrage anstelle der abgebildeten Einheit:

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

Above ich, dass Sie declarative Erweiterung verwenden angenommen.

+0

Hallo van, Ihre anwser mir helfen, aber ich habe dieses Ergebnis: [(, 2), (, 0) (, 0)] Wie kann ich die 2, 0 und 0 in der persist.maintenance.Maintener.object erhalten resultierende dies: [, (, () wie in_stock_devices ist ein Attribut von persist.maintenance.Maintener. –

+0

Wird die Antwort erweitern ... – van