55

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

4

3 回答 3

54

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

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()
于 2008-08-03T01:17:36.393 回答
27

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

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

In this example, cx_Oracle will fetch rows from Oracle 256 rows at a time, reducing the number of network round trips that need to be performed

于 2008-09-24T02:51:00.173 回答
6

似乎也有办法psyco-pg做到这一点......据我所知,它似乎创建了类似字典的行代理来将键查找映射到查询返回的内存块中。在这种情况下,获取整个答案并在行上使用类似的代理工厂似乎很有用。不过仔细想想,感觉更像是 Lua 而不是 Python。

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

于 2008-08-24T17:28:26.200 回答