使用日期和混合属性在SQLAlchemy中过滤查询

0 投票
1 回答
860 浏览
提问于 2025-04-18 09:26

我有一个数据库表,里面有三个列: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))

撰写回答