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()
其他提示
我的首选方法是游标迭代器,但首先设置游标的 arraysize 属性。
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
在此示例中,cx_Oracle 将一次从 Oracle 256 行中获取行,从而减少需要执行的网络往返次数
还有办法 psyco-pg
似乎要做...据我所知,它似乎创建了类似字典的行代理来将键查找映射到查询返回的内存块中。在这种情况下,获取整个答案并在行上使用类似的代理工厂似乎是有用的想法。但仔细想想,它感觉更像是 Lua,而不是 Python。
另外,这应该适用于所有 PEP-249 DBAPI2.0 接口,不仅仅是 Oracle,或者您的意思只是 最快的 使用 甲骨文?
不隶属于 StackOverflow