Python db-api: fetchone vs fetchmany vs fetchall

Недавно у меня было обсуждение с некоторыми сотрудниками о python db-api fetchone vs fetchmany vs fetchall.

Я уверен, что прецедент для каждого из них зависит от реализации db-api, который я использую, но в целом, какие варианты использования для fetchone vs fetchmany vs 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

Ответ 1

Я думаю, что это действительно зависит от реализации, но вы можете получить представление о различиях, заглянув в источники MySQLdb. В зависимости от параметров mysqldb fetch * сохраняет текущий набор строк в памяти или на стороне сервера, поэтому fetchmany vs fetchone имеет определенную гибкость здесь, чтобы знать, что хранить в памяти (python) и что поддерживать сервер db.

PEP 249 не дает подробностей, поэтому я предполагаю, что это оптимизировать вещи в зависимости от базы данных, тогда как точная семантика определяется реализацией.

Ответ 2

Это специфичные для реализации.

  • fetchall

Получит все результаты из таблицы. Это будет работать лучше, если размер таблицы невелик. Если размер таблицы больше, fetchall будет терпеть неудачу в этих случаях.

Будет использовать большую часть памяти.

Повреждение некоторых проблем может возникнуть, если запросы выполняются в сети.

  • fetchmany

fetchmany получит только необходимое количество результатов. Вы можете дать результаты и процесс. Простой фрагмент реализации fetchmany.

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