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 будет терпеть неудачу в этих случаях.
Будет использовать большую часть памяти.
Повреждение некоторых проблем может возникнуть, если запросы выполняются в сети.
fetchmany получит только необходимое количество результатов. Вы можете дать результаты и процесс. Простой фрагмент реализации fetchmany.
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result