有几种方法可以遍历结果集。各方的权衡是什么?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. 结果迭代
- 2. 如何通过OracleDbType.RefCursor结果集进行迭代
- 3. Select Query的迭代结果
- 4. 迭代行结果错误
- 5. 如何迭代JSON结构?
- 6. 如何总结值迭代
- 7. 如何将迭代应用的结果相结合
- 8. 如何将迭代(从每个iter。)结果追加到包含所有迭代结果的最终Dataframe?
- 9. 如何存储和迭代MySQL存储过程中的结果集?
- 10. 在Laravel控制器中迭代结果集
- 11. PyTables问题 - 在迭代表子集时产生不同结果
- 12. redshift返回的结果集是否支持重置迭代器?
- 13. VBA通过迭代ADODB结果集来删除记录
- 14. 迭代为一个漂亮的结果集python
- 15. 从asp.net mvc方法迭代结果集时jquery ajax错误
- 16. 迭代集合并将结果放入变量?
- 17. 在Nodejs中对字段进行迭代MySQL结果集
- 18. Python数据库API v2>如果在迭代期间执行的查询没有返回任何结果,则对结果集的迭代将停止
- 19. 如何在cx_Oracle和Sql * Plus上创建相同的结果?
- 20. PHP foreach迭代前一个结果
- 21. svn update:我可以迭代结果吗?
- 22. 迭代LINQ的结果使用索引
- 23. 保存每次迭代的结果python
- 24. Linq查询的迭代结果
- 25. 将结果迭代回OpenCL内核
- 26. 安排从迭代结果到表JSP
- 27. AssertJ结果反馈与“迭代断言”
- 28. 迭代两个数据集并将结果返回给一个数据集
- 29. C++迭代器+整数当迭代器结束时的结果是什么?
- 30. 在Rails中执行结果的迭代结果
有例外,但一般的经验法则是:如果有多种方法可以做到这一点,可能是因为每种方式都适用于不同的情况。否则只会有一种方法。 – 2012-05-23 02:13:52