cx_Oracle:如何遍历结果集?

55 投票
3 回答
60015 浏览
提问于 2025-04-10 23:48

有几种方法可以遍历结果集。每种方法有什么优缺点呢?

3 个回答

6

还有一种方法是 psyco-pg 似乎在使用的方式……根据我的理解,它好像是创建了一种像字典一样的行代理,用来将键的查找映射到查询返回的内存块中。这样一来,获取整个结果并使用类似的代理工厂来处理这些行,听起来是个不错的主意。不过仔细想想,这种方式更像是 Lua 而不是 Python。

另外,这种方法应该适用于所有的 PEP-249 DBAPI2.0 接口,而不仅仅是 Oracle,还是说你只是想说在使用 Oracle 时是 最快 的?

27

我比较喜欢用游标迭代器,不过要先设置游标的数组大小属性。

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

在这个例子中,cx_Oracle 会一次从 Oracle 数据库获取 256 行数据,这样可以减少需要进行的网络往返次数。

56

最常用的方法是使用内置的游标迭代器。

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

撰写回答