我有数据库表,其中包含列year_id,month_id和day_id(全部为NUMBER)。我想创建一个过滤日期的查询。为了简化它,我想添加hybrid_property将所提到的字段连接到日期。
class MyModel(Base): __table__ = Base.metadata.tables['some_table'] @hybrid_property def created_on(self): return date(self.year_id, self.month_id, self.day_id)
但是当我进行查询时
session.query(MyModel).filter(MyModel.created_on==date(2010, 2, 2))
我收到错误TypeError: an integer is required (got type InstrumentedAttribute)
。
是否有其他方法可以执行此类过滤:我无法修改数据库模式(因此字段应保持不变),但同时难以将日期与3个单独的列进行比较?
答案 0 :(得分:1)
您需要在混合属性中添加表达式,但根据您的RDBMS,它可能会有所不同。请参阅下面的sqlite
的示例:
@hybrid_property
def created_on(self):
return date(self.year_id, self.month_id, self.day_id)
@created_on.expression
def created_on(cls):
# @todo: create RDBMS-specific fucntion
# return func.date(cls.year_id, cls.month_id, cls.day_id)
# below works on Sqlite: format to YYYY-MM-DD
return (func.cast(cls.year_id, String) + '-' +
func.substr('0' + func.cast(cls.month_id, String), -2) + '-' +
func.substr('0' + func.cast(cls.day_id, String), -2))