2012-03-21 81 views
4

目前,我查询我的数据库是这样的:是否可以通过sqlalchemy查询数据库?

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

由于将查询转换为等效的SQL SELECT语句,因此只能在获取此事务启动时存在的查询为0的作者行集合。作者查询列的任何更新都不会更改当前的SELECT集。

如果要继续处理,即使有超过1000,那么你可以做

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

查询对象上的__iter__方法会自动调用将返回相同的迭代器和调用的所有作者的行查询对象上的instances

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()

+0

如果我没有提交,如果我的脚本崩溃了,那么每个东西都会丢失......所以最好用一个while循环包装实际的脚本,只要有''query'0 “真的,对吗? – Aufwind 2012-03-22 09:22:10

+0

一个自然的提交地点就在你的循环完成之后。但是如果你有很多变化,那可能是一笔大交易,而且表现不佳。如果是这样,原始问题陈述中的切片实际上可能会更好。这取决于你正在做什么以及可能返回多少行。 – wberry 2012-03-22 16:47:09

+0

作为更新postgres支持监听/通知事件api – morissette 2017-11-28 01:57:29