2012-03-21 89 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

相關問題