是否可以通过sqlalchemy对数据库进行类似生成器的查询?

时间:2012-03-21 16:52:40

标签: python database sqlalchemy generator

目前我以这种方式查询我的数据库:

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为真的下一位作者

2 个答案:

答案 0 :(得分:2)

查询对象可以按原样视为迭代器。一旦开始使用查询迭代器中的数据,就会执行SQL。例如:

for author in session.query(Author).filter(Author.queried==0):
    print "Processing: ", author

你的问题使用“无休止”这个词,所以要小心谨慎。 SQL不是事件处理API;你不能简单地做一个“永远”运行的查询,并在每个新行添加到表时吐出。我希望这是可能的,但事实并非如此。

如果您的目的是检测新行,则必须使用相同的查询定期轮询,并在数据模型中设计一个指示器,以便您可以告诉您哪些行是新的。您似乎现在使用queried列表示。在这种情况下,您可以在上面的for循环中设置author.queried = 1session.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相同的迭代器。