使用日期和混合属性在SQLAlchemy中过滤查询
我有一个数据库表,里面有三个列:year_id、month_id和day_id(它们都是数字类型)。我想写一个查询,用来筛选日期。为了简化这个过程,我想添加一个混合属性,把这三个字段合并成一个日期。
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)
。
有没有其他方法可以进行这样的筛选呢?我不能修改数据库的结构(所以这些字段必须保持不变),但同时用三个不同的列来比较日期也很麻烦。
1 个回答
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))