Python SQLAlchemy中带有日期和混合属性的筛选查询

Python SQLAlchemy中带有日期和混合属性的筛选查询,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我有一个数据库表,其中包含year\u id、month\u id和day\u id列(都是数字)。我想做一个过滤日期的查询。为了简化它,我想添加hybrid_属性,将所提到的字段合并到date中 但当我提出疑问时 我得到一个错误TypeError:需要一个整数(得到类型InstrumentedAttribute) 有没有其他方法可以进行这种筛选:我不能修改db模式(因此字段应该保持不变),但同时很难将日期与3个单独的列进行比较?您需要向混合属性添加一个表达式,但它可能会因您的RDBMS而异。有

我有一个数据库表,其中包含year\u id、month\u id和day\u id列(都是数字)。我想做一个过滤日期的查询。为了简化它,我想添加hybrid_属性,将所提到的字段合并到date中

但当我提出疑问时

我得到一个错误
TypeError:需要一个整数(得到类型InstrumentedAttribute)


有没有其他方法可以进行这种筛选:我不能修改db模式(因此字段应该保持不变),但同时很难将日期与3个单独的列进行比较?

您需要向混合属性添加一个表达式,但它可能会因您的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))

如果您能够做到这一点,我建议您在数据库中创建一个带有
DATE
值的计算列。我不确定是否还有其他RDBMS,但在MSSQL中,您甚至可以持久化计算列并在其上创建索引。您还需要为SA Accorringly配置此列(请参阅)。亲爱的各位,请改进答案-如果您知道的话,请简化sqlite的日期转换。非常感谢。
session.query(MyModel).filter(MyModel.created_on==date(2010, 2, 2))
@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))