使用date和hybrid_property在SQLAlchemy中过滤查询

时间:2014-06-11 14:18:14

标签: python sql sqlalchemy

我有数据库表,其中包含列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个单独的列进行比较?

1 个答案:

答案 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))