Python db-api: fetchone vs fetchmany vs fetchall

У меня только что была дискуссия сегодня с некоторыми коллегами о DB-api fetchone от python против fetchmany против 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

2 ответов


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

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


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

  • fetchall

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

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

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

  • fetchmany

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

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