python -cx_Oracle:如何遍历结果集?

Translate

有几种方法可以遍历结果集。两者的权衡是什么?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

规范的方法是使用内置的游标迭代器。

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()
来源
Translate

我的首选方式是游标迭代器,但首先要设置游标的arraysize属性。

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

在此示例中,cx_Oracle将一次从Oracle 256行中获取行,从而减少了需要执行的网络往返次数

来源
Translate

还有办法psyco-pg似乎做到了...从我的收集来看,似乎创建了类似于字典的行代理来将键查找映射到查询返回的内存块中。在这种情况下,获取整个答案并在行中使用类似的代理工厂似乎是有用的想法。尽管想一想,它更像是Lua,而不是Python。

而且,这应该适用于所有PEP-249数据库API2.0接口,而不仅仅是Oracle,或者您的意思仅仅是最快的使用甲骨文?

来源
下一个问题:
c# -稳健随机数生成