【问题标题】:Compare DateTime and Interval in SQLAlchemy比较 SQLAlchemy 中的 DateTime 和 Interval
【发布时间】:2013-01-16 20:17:41
【问题描述】:

我有这门课:

class Monitor(db.Model):
    '''
    Base Monitor class.
    '''
    __tablename__ = 'monitor'
    id = db.Column(db.Integer(), primary_key=True)
    last_checked = db.Column(db.DateTime(timezone=False))
    poll_interval = db.Column(db.Interval(),
                              default=datetime.timedelta(seconds=300))

我有这个查询,我试图只返回自(现在 - 间隔)以来未检查过的对象:

monitors = db.session.query(Monitor).\
           filter(or_(Monitor.last_checked < (datetime.utcnow() - Monitor.poll_interval)),
                      Monitor.last_checked == None).\
           all()

但查询没有返回任何内容。我很难找出正确的方法来做到这一点。我是在正确的轨道上还是我错过了什么?我使用 MySQL 作为数据库。

【问题讨论】:

  • 您可以打印出一个 Query 对象(即,您在调用 .all() 之前拥有的对象)以获取将要运行的实际 SQL。我唯一的猜测是 SQLA 不知道使用古怪的date - INTERVAL 3 DAYS 语法
  • 这就是它给我的。 SELECT monitor.id AS monitor_id, monitor.last_checked AS monitor_last_checked, monitor.poll_interval AS monitor_poll_interval FROM monitor WHERE monitor.last_checked &lt; :poll_interval_1 - monitor.poll_interval

标签: python mysql sqlalchemy flask-sqlalchemy


【解决方案1】:

你的括号是错误的。我相信你想要的是:

monitors = db.session.query(Monitor).\
       filter(or_(Monitor.last_checked < (datetime.utcnow() - Monitor.poll_interval),
                  Monitor.last_checked == None)).\
       all()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2014-05-02
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多