如何定义混合表达式?
How to define a hybrid expression?
我有两个 class,事件和预订。一个活动可以容纳多个预订。
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
space = Column(Integer)
class Booking(Base):
__tablename_ = 'booking'
id = Column(Integer, primary_key=True)
event_id = Column(Integer, ForeignKey('event.id'))
event = relationship('Event', backref=backref('bookings'))
现在我想计算入住率并决定采用事件 class 的混合 属性,如下所示:
@hybrid_property
def occupancy(self):
return float(len(self.bookings)) / float(self.space)
这在某些情况下工作正常,但当我希望能够过滤入住率时,如下所示:
session.query(Event).filter(Event.occupany > 0.5)
这样做我得到这个错误:
TypeError: object of type 'InstrumentedAttribute' has no len()
所以我意识到我可能需要一个混合表达式并想出了:
@occupancy.expression
def occupancy(cls):
return func.count(select([Booking.id]).where(cls.id == Booking.event_id).label('occupancy')) / cls.space
然而,这会导致 MySQL 错误:
sqlalchemy.exc.ProgrammingError: (_mysql_exceptions.ProgrammingError)
(1111, 'Invalid use of group function') [SQL: u'SELECT event.id AS
event_id FROM event \nWHERE count((SELECT booking.id \nFROM booking
\nWHERE event.id = booking.event_id)) / event.space > %s']
[parameters: (0.5,)]
如何构建混合表达式?或者有更好的方法来实现我想要的吗?
计数应在 scalar subquery 内完成。当前查询试图将 count()
函数应用于封闭查询的 WHERE 子句中的子查询的结果集,另一方面,它没有分组,所以你会得到错误——更不用说聚合函数作为谓词属于 HAVING 子句。只需移动呼叫:
@occupancy.expression
def occupancy(cls):
stmt = select([func.count(Booking.id)]).\
where(cls.id == Booking.event_id).\
label('occupancy')
return stmt / cls.space
我有两个 class,事件和预订。一个活动可以容纳多个预订。
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
space = Column(Integer)
class Booking(Base):
__tablename_ = 'booking'
id = Column(Integer, primary_key=True)
event_id = Column(Integer, ForeignKey('event.id'))
event = relationship('Event', backref=backref('bookings'))
现在我想计算入住率并决定采用事件 class 的混合 属性,如下所示:
@hybrid_property
def occupancy(self):
return float(len(self.bookings)) / float(self.space)
这在某些情况下工作正常,但当我希望能够过滤入住率时,如下所示:
session.query(Event).filter(Event.occupany > 0.5)
这样做我得到这个错误:
TypeError: object of type 'InstrumentedAttribute' has no len()
所以我意识到我可能需要一个混合表达式并想出了:
@occupancy.expression
def occupancy(cls):
return func.count(select([Booking.id]).where(cls.id == Booking.event_id).label('occupancy')) / cls.space
然而,这会导致 MySQL 错误:
sqlalchemy.exc.ProgrammingError: (_mysql_exceptions.ProgrammingError)
(1111, 'Invalid use of group function') [SQL: u'SELECT event.id AS
event_id FROM event \nWHERE count((SELECT booking.id \nFROM booking
\nWHERE event.id = booking.event_id)) / event.space > %s']
[parameters: (0.5,)]
如何构建混合表达式?或者有更好的方法来实现我想要的吗?
计数应在 scalar subquery 内完成。当前查询试图将 count()
函数应用于封闭查询的 WHERE 子句中的子查询的结果集,另一方面,它没有分组,所以你会得到错误——更不用说聚合函数作为谓词属于 HAVING 子句。只需移动呼叫:
@occupancy.expression
def occupancy(cls):
stmt = select([func.count(Booking.id)]).\
where(cls.id == Booking.event_id).\
label('occupancy')
return stmt / cls.space