【问题标题】:Using a SQLAlchemy Integer field to create a timedelta object for filtering使用 SQLAlchemy 整数字段创建用于过滤的 timedelta 对象
【发布时间】:2015-07-11 22:32:04
【问题描述】:

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

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

我认为应该这样做:

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

但我无法创建这样的时间增量。我收到此错误:

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


    【解决方案1】:

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

    如果您使用的是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

    【讨论】:

    • 如果 Item.days 是一个浮点数呢?
    • @mpounsett:secs 参数是double。因此,只需将您的值转换为秒并作为 secs 参数传递。
    【解决方案2】:
    now = utcnow()
    session.query(Item).filter(Item.created_on + func.make_interval(0, 0, 0, Item.days) <= now)
    

    【讨论】:

    • 最好在答案中添加一些解释。通过这种方式,未来的用户也可以更好地了解您的贡献
    猜你喜欢
    • 2023-03-21
    • 2013-05-27
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-06-17
    相关资源
    最近更新 更多