基于表列值的时间增量

时间:2019-02-14 02:48:16

标签: python postgresql sqlalchemy timedelta

我有一个表,该表包含10k rss_feed URL,由于它们的发布频率,我想在不同的时间对其进行解析。在我的Feed表中,有以下几列:

  1. rss_url(字符串)
  2. last_parsed_at(带时区的UTC日期时间)
  3. 频率(int)

我想根据频率获取所有要排队的提要对象。频率列是秒数。

我正尝试使用以下查询

rss_query=db.session.query(Feed).filter(Feed.rss_url.isnot(None)).filter(Feed.available==True).filter(Feed.last_parsed_at+timedelta(seconds=Feed.frequency)<datetime.utcnow())

我收到以下错误

  

TypeError:timedelta秒组件的不受支持的类型:   InstrumentedAttribute

1 个答案:

答案 0 :(得分:1)

Python的timedelta不能理解SQLAlchemy的构造。它处理Python中的数字。为了产生间隔SQL表达式,您必须使用SQL Expression Language来产生合适的DBMS特定构造。如果使用Postgresql,则可以使用make_interval()

rss_query = db.session.query(Feed).\
    filter(Feed.rss_url.isnot(None)).\
    filter(Feed.available).\
    filter(Feed.last_parsed_at +
           func.make_interval(0, 0, 0, 0, 0, 0, Feed.frequency) <
           datetime.utcnow())

不幸的是,func函数不支持命名参数,因此您必须显式传递年,月,周,天,小时和分钟。

另一种选择是使用一些算法:

filter(Feed.last_parsed_at +
       cast('1 second', Interval) * Feed.frequency <
       datetime.utcnow())