cx_Oracle:如何迭代结果集?
时间:2020-03-05 18:37:23 来源:igfitidea点击:
有几种方法可以遍历结果集。两者的权衡是什么?
解决方案:
规范的方法是使用内置的游标迭代器。
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()
psyco-pg似乎也可以做到这一点……据我所知,它似乎创建了类似于字典的行代理,以将键查找映射到查询返回的内存块中。在那种情况下,获取整个答案并在行中使用类似的代理工厂似乎是有用的主意。尽管想一想,它更像是Lua,而不是Python。
而且,这应该适用于所有PEP-249 DBAPI2.0接口,而不仅仅是Oracle,或者我们是说使用Oracle最快?
我的首选方式是游标迭代器,但首先要设置游标的arraysize属性。
curs.execute('select * from people') curs.arraysize = 256 for row in curs: print row
在此示例中,cx_Oracle将一次从Oracle 256行中获取行,从而减少了需要执行的网络往返次数