使用SQLAlchemy Integer字段创建timedelta对象以进行过滤

问题描述 投票:2回答:2

我有一个名为Item的对象。它有2个字段:一个名为“created_on”的日期时间行和一个名为“days”的整数行。

我想查询很多天前“天”创建的所有对象。

以下是我认为应该如何做的事情:

now = utcnow()
session.query(Item).filter(Item.created_on + Interval(timedelta(days=Item.days)) <= now)

但是我无法像这样创造一个timedelta。我收到这个错误:

TypeError: unsupported type for timedelta minutes component: InstrumentedAttribute

更新:

感谢van,我应该使用内置函数。我正在使用Mysql 5.1,所以它将是timestampadd。我的新查询是这样的:

now = utcnow()
session.query(Item).filter(func.timestampadd('DAY', Item.days, Item.created_on) <= now)

但是,我得到的新错误是:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''DAY', items.days, items.created_on) <= '2015-07-12 ' at line 3
python mysql sqlalchemy timedelta
2个回答
4
投票

我不认为Interval会帮助你,因为它无法强制进入特定于DB的日期[时间]功能。所以你应该使用特定于平台的日期[时间]函数来解决这个问题。

如果你使用postgresql,下面的代码应该工作(假设Items.days是整数):

q = (session.query(Item)
     .filter(func.age(now, Item.created_on) <=
             func.make_interval(0, 0, 0, Item.days)
             )
     )

有关更多信息,请参阅postgres' Date/Time Functions and Operators


0
投票
now = utcnow()
session.query(Item).filter(Item.created_on + func.make_interval(0, 0, 0, Item.days) <= now)
© www.soinside.com 2019 - 2024. All rights reserved.