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

Je crée un rapport qui montre tous les mainteneurs mais j'ai besoin de montrer le nombre de périphériques que chacun de ces mainteneurs a en regardant la référence du modèle de périphériques in_stock_maintener_id;Comment faire cette requête dans sqlalchemy?

J'ai ce modèle dans ma persistance 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') 

Si quelqu'un pouvait me aider, je serai reconnaissant =)

Répondre

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

requête ci-dessus renvoie une dénombrable de tuple(Maintener, Integer).

Si vous souhaitez avoir des colonnes à la place (selon votre commentaire), vous pouvez spécifier les colonnes que vous voulez dans la requête implicitement:

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

ou si vous souhaitez toutes les colonnes (comme dans SELECT *), alors vous pouvez interroger le Table au lieu de l'entité mappée:

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

au-dessus, je suppose que vous utilisez declarative l'extension.

+0

Salut van, votre anwser me aider, mais je m'y suis ce résultat: [(, 2), (, 0) , (, 0)] Comment puis-je obtenir les 2, 0 et 0 à l'intérieur de l'objet persist.maintenance.Maintener.object résultant de ceci: [, (objet , (objet ] comme in_stock_devices est un attribut de persist.maintenance.Maintener –

+0

va étendre la réponse ... – van