如何在sqlalchemy中进行此查询?

时间:2017-10-17 15:42:10

标签: mysql sql sqlalchemy flask-sqlalchemy

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中有这些模型。

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 个答案:

答案 0 :(得分: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扩展名。