cx_Oracle:如何迭代结果集?

nodio 发布于 2018-02-04 database 最后更新 2018-02-04 01:05 1016 浏览

迭代结果集有多种方法。什么是每个的权衡?

已邀请:

nodio

赞同来自:

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

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()
    

ad_est

赞同来自:

还有psyco-pg似乎这样做的方式...从我所收集的,似乎创建类似字典的行代理映射到查询返回的内存块的密钥查找。在这种情况下,获取整个答案并在行上使用类似的代理工厂似乎是有用的想法。想想看,虽然感觉比Lua更像Lua。 此外,这应该适用于所有PEP-249 DBAPI2.0接口,不仅仅是Oracle,还是您使用 Oracle 最快的

zcum

赞同来自:

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

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row
在这个例子中,cx_Oracle将一次从Oracle 256行中读取行,减少了需要执行的网络往返次数