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')
如果有人能帮助我,我会感激=)
答案 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
扩展名。