2008-08-03 107 views
34

有幾種方法可以遍歷結果集。各方的權衡是什麼?cx_Oracle:如何迭代結果集?

+1

有例外,但一般的經驗法則是:如果有多種方法可以做到這一點,可能是因爲每種方式都適用於不同的情況。否則只會有一種方法。 – 2012-05-23 02:13:52

回答

34

規範的方法是使用內置的遊標迭代器。

curs.execute('select * from people') 
for row in curs: 
    print row 

您可以使用fetchall()一次獲得所有行。

for row in curs.fetchall(): 
    print row 

它可以方便地使用它來創建一個包含值的Python列表返回:

curs.execute('select first_name from people') 
names = [row[0] for row in curs.fetchall()] 

這對於較小的結果集是有用的,但也有不好的副作用,如果結果集很大。

  • 您必須等待整個結果集返回到 您的客戶端進程。

  • 你可能會吃掉你的客戶端中的大量內存來保存 的內置列表。

  • Python可能需要一段時間來構建和解構您將立即丟棄的列表。


如果你知道有結果集中,你可以打電話fetchone()獲得單行返回一行。

curs.execute('select max(x) from t') 
maxValue = curs.fetchone()[0] 

最後,您可以遍歷結果集一次讀取一行。一般來說,使用迭代器不會有什麼特別的優勢。

row = curs.fetchone() 
while row: 
    print row 
    row = curs.fetchone() 
+1

關於第二種方法,如果您使用SScursor?它會消耗很多內存嗎? – Sylvain 2009-11-27 10:50:17

+0

我認爲SScursor是針對MySQL的。但是任何具有fetchall()的東西都可能具有相同的內存使用情況,因爲它會返回所有返回的行的列表。 – 2009-11-27 20:25:49

4

還有順便psyco-pg似乎做...從我收集,似乎創造類似字典的行代理來查找鍵映射到該查詢返回的內存塊。在這種情況下,獲取整個答案並在行上使用類似的代理工廠似乎是有用的想法。想想看,雖然感覺比Lua更像Lua。

而且,這應該是適用於所有PEP-249 DBAPI2.0接口,而不僅僅是甲骨文,還是你使用甲骨文意味着只是最快

21

我的首選方法是遊標迭代器,但首先設置遊標的arraysize屬性。

curs.execute('select * from people') 
curs.arraysize = 256 
for row in curs: 
    print row 

在這個例子中,cx_Oracle將256行,在一個時間內獲取從Oracle行,減少了需要進行網絡往返次數