Timedelta基于表列值

问题描述 投票:0回答:1

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

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

我希望得到所有根据频率排队的Feed对象。频率列是秒数。

我试图使用以下查询

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 seconds组件的不支持类型:InstrumentedAttribute

python postgresql sqlalchemy timedelta
1个回答
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())
© www.soinside.com 2019 - 2024. All rights reserved.