目前我以这种方式查询我的数据库:
for author in session.query(Author).filter(Author.queried==0).slice(0, 1000):
print "Processing:", author
# do stuff and commit later on
这意味着每1000个作者我必须重新启动脚本。
是否可以使脚本无限运行(或者只要有作者)?我的意思是,如果可以转
session.query(Author).filter(Author.queried==0).slice(0, 1000)
进入某种生成器,产生 queried==0
为真的下一位作者。
答案 0 :(得分:2)
查询对象可以按原样视为迭代器。一旦开始使用查询迭代器中的数据,就会执行SQL。例如:
for author in session.query(Author).filter(Author.queried==0):
print "Processing: ", author
你的问题使用“无休止”这个词,所以要小心谨慎。 SQL不是事件处理API;你不能简单地做一个“永远”运行的查询,并在每个新行添加到表时吐出。我希望这是可能的,但事实并非如此。
如果您的目的是检测新行,则必须使用相同的查询定期轮询,并在数据模型中设计一个指示器,以便您可以告诉您哪些行是新的。您似乎现在使用queried
列表示。在这种情况下,您可以在上面的for
循环中设置author.queried = 1
和session.add(author)
。但你不能在循环中session.commit()
。
答案 1 :(得分:0)
由于查询转换为等效的SQL SELECT语句,因此只能获取此事务启动时存在的查询为0的作者行集。对作者查询列的任何更新都不会更改当前的SELECT集。
如果你想继续处理所有的作者行,即使有超过1000行,你也可以
for author in session.query(Author).filter(Author.queried==0):
print "Processing:", author
将自动调用Query对象上的__iter__
方法,该方法将返回与在Query对象上调用instances
相同的迭代器。