Python db-api:fetchone vs fetchmany与fetchall

我今天和一些同事讨论了python的db-api fetchone与fetchmany和fetchall的区别。

我敢肯定这些用例中的每一个都依赖于我使用的db-api的实现,但是一般来说,fetchone vs fetchmany和fetchall的用例是什么?

换句话说,是下面的等价物? 还是有其中一种比其他更受欢迎? 如果是的话,在哪种情况下?

cursor.execute("SELECT id, name FROM `table`") for i in xrange(cursor.rowcount): id, name = cursor.fetchone() print id, name cursor.execute("SELECT id, name FROM `table`") result = cursor.fetchmany() while result: for id, name in result: print id, name result = cursor.fetchmany() cursor.execute("SELECT id, name FROM `table`") for id, name in cursor.fetchall(): print id, name 

我认为这实际上取决于实现,但您可以通过查看MySQLdb源代码来了解这些差异。 根据不同的选项,mysqldb fetch *将当前的一组行保留在内存或服务器端,所以fetchmany vs fetchone在这里有一些灵活性来知道在(python)内存中保留什么以及保留db服务器端的内容。

PEP 249没有提供太多的细节,所以我想这是根据数据库优化事情,而确切的语义是实现定义的。

这些是特定于实现的。

  • 使用fetchall

将从表中获得所有结果。 如果桌子的尺寸很小,这样会更好。 如果表格尺寸较大,fetchall将在这些情况下失败。

将使用大部分的内存。

如果查询是在networking上完成,将会导致一些问题。

  • 支持fetchmany

fetchmany将只获得所需数量的结果。 你可以产生结果和过程。 fetchmany的简单执行代码片段。

  while True: results = cursor.fetchmany(arraysize) if not results: break for result in results: yield result