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