cx_Oracle:如何迭代结果集?

时间:2008-08-03 01:15:09

标签: python sql database oracle cx-oracle

有几种方法可以迭代结果集。每个人的权衡是什么?

3 个答案:

答案 0 :(得分:40)

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

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 :(得分:23)

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

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

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

答案 2 :(得分:5)

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

此外,这应该适用于所有PEP-249 DBAPI2.0接口,而不仅仅适用于Oracle,或者您的意思是最快使用 Oracle