【问题标题】:SQLAlchemy: adding Integer column to DateTimeSQLAlchemy:将整数列添加到 DateTime
【发布时间】:2014-07-31 09:58:05
【问题描述】:

给定一张桌子

class Order(db.Model):
  created_at = db.Column(db.DateTime)
  days = db.Column(db.Integer)

我需要使用 FROM 语句编写一个查询,如下所示:Order.created_at + Order.days < datetime.now()。最简单的方法行不通,因为 datetime 加整数的结果是 double :) 这个结论是我在 MySQL 实际实验后得出的。

经过一番搜索,我找到了解决所描述问题的 MySQL 的正确 SQL 语句:

SELECT *
FROM orders o
WHERE o.created_at + INTERVAL o.days DAY < '2014-06-10 14:22:00';

我想问的是如何为上面的查询编码 sqlalchemy 过滤器? 我找到了一篇文章 how to use Intervals here on stackoverflow,但在 MySQL 中缺少 DATEADD,我不知道需要在哪里绑定 Interval。

对不起,我的英语很差,我希望我能正确解释我的问题:)

UPD:将days 定义为间隔也许是正确的做法,但目前它不是一个选项。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    MySQL 有一个名为TIMESTAMPADD 的函数,它似乎可以满足您的需求。以下是如何在查询中使用它。

    session.query(Order).filter(func.timestampadd(text('DAY'), Order.days, Order.created_at) < datetime(2014, 6, 10, 14, 22))
    

    【讨论】:

      【解决方案2】:
      from sqlalchemy import select, func
      
      query = (session.query(Orders).filter(
                   func.DATEADD('day', Orders.days, Orders.created_at) == '2014-06-10 14:22:00'))
      

      【讨论】:

        【解决方案3】:

        老问题,但对于使用 PSQL / SQLAlchemy 1.0.10+ 的任何人,您都可以使用以下内容:

        from sqlalchemy.sql import cast
        db = SQLAlchemy()  # Instantiated 
        
        Order.query.filter(
            Order.created_at > cast('1 DAY', db.Interval) * Order.day
        ).all()
        

        【讨论】:

          猜你喜欢
          • 2021-07-24
          • 1970-01-01
          • 2020-09-22
          • 1970-01-01
          • 2016-11-16
          • 2013-08-01
          • 2019-08-11
          • 2020-01-17
          相关资源
          最近更新 更多