我有一个表,该表包含10k rss_feed URL,由于它们的发布频率,我想在不同的时间对其进行解析。在我的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秒组件的不受支持的类型: InstrumentedAttribute
答案 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())