有幾種方法可以遍歷結果集。各方的權衡是什麼?cx_Oracle:如何迭代結果集?
回答
規範的方法是使用內置的遊標迭代器。
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()
關於第二種方法,如果您使用SScursor?它會消耗很多內存嗎? – Sylvain 2009-11-27 10:50:17
我認爲SScursor是針對MySQL的。但是任何具有fetchall()的東西都可能具有相同的內存使用情況,因爲它會返回所有返回的行的列表。 – 2009-11-27 20:25:49
還有順便psyco-pg
似乎做...從我收集,似乎創造類似字典的行代理來查找鍵映射到該查詢返回的內存塊。在這種情況下,獲取整個答案並在行上使用類似的代理工廠似乎是有用的想法。想想看,雖然感覺比Lua更像Lua。
而且,這應該是適用於所有PEP-249 DBAPI2.0接口,而不僅僅是甲骨文,還是你使用甲骨文意味着只是最快?
我的首選方法是遊標迭代器,但首先設置遊標的arraysize屬性。
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
在這個例子中,cx_Oracle將256行,在一個時間內獲取從Oracle行,減少了需要進行網絡往返次數
- 1. 如何迭代MySQL結果集?
- 2. Scalikejdbc結果集迭代器
- 3. 如何迭代CTE結果
- 4. 結果迭代
- 5. 使用迭代器遍歷結果集?
- 6. 迭代sequelize查詢結果集(Hapijs)
- 7. 在sequelize結果集內迭代
- 8. MySQL - 迭代結果集中的列
- 9. 需要循環或迭代結果集
- 10. PDO結果迭代
- 11. 如何通過OracleDbType.RefCursor結果集進行迭代
- 12. 更新迭代結果
- 13. 迭代通過JSOn結果
- 14. 迭代JPA查詢結果
- 15. Tess4j結果迭代器
- 16. Select Query的迭代結果
- 17. 迭代行結果錯誤
- 18. 如何總結值迭代
- 19. 如何迭代JSON結構?
- 20. 迭代通過柱和總結結果
- 21. 如何將迭代應用的結果相結合
- 22. prolog擴展謂詞以迭代多個結果,合併/解析結果集
- 23. 如何將迭代(從每個iter。)結果追加到包含所有迭代結果的最終Dataframe?
- 24. 如何存儲和迭代MySQL存儲過程中的結果集?
- 25. 從asp.net mvc方法迭代結果集時jquery ajax錯誤
- 26. 分配變量到MySQL迭代結果集
- 27. JDBC結果集上的多個迭代器
- 28. 迭代Postgres/PHP/PDO中結果集的最佳實踐?
- 29. 結果集迭代只有一個時間,而循環
- 30. C++ set ordered iterating - 迭代集合的結果,按標準排序?
有例外,但一般的經驗法則是:如果有多種方法可以做到這一點,可能是因爲每種方式都適用於不同的情況。否則只會有一種方法。 – 2012-05-23 02:13:52