Python db-api: fetchone против fetchmany против fetchall - PullRequest
60 голосов
/ 04 марта 2011

У меня только что была дискуссия с некоторыми коллегами о том, что db-api fetchone Python против fetchmany vs fetchall.

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

Ответы [ 3 ]

14 голосов
/ 04 марта 2011

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

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

7 голосов
/ 19 августа 2016

Это зависит от реализации.

  • fetchall

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

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

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

  • fetchmany

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

   while True:
    results = cursor.fetchmany(arraysize)
    if not results:
        break
    for result in results:
        yield result
4 голосов
/ 09 октября 2018

fetchone ()

Извлечь следующую строку набора результатов запроса, возвращая один кортеж, или None, если больше нет доступных данных:

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()

(3, 42, 'bar')

Ошибка ProgrammingError возникает, если предыдущий вызов execute * () не дал никакого набора результатов, или еще не было выполнено никакого вызова.

fetchmany ([size = cursor.arraysize])

Извлечь следующий набор строк результата запроса, возвращая список кортежей.Пустой список возвращается, когда больше нет доступных строк.

Количество строк, извлекаемых за вызов, определяется параметром.Если он не задан, размер массива курсора определяет количество строк, которые нужно получить.Метод должен попытаться извлечь столько строк, сколько указано параметром size.Если это невозможно из-за недоступности указанного числа строк, может быть возвращено меньшее количество строк:

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchmany(2)
[(1, 100, "abc'def"), (2, None, 'dada')]
>>> cur.fetchmany(2)
[(3, 42, 'bar')]
>>> cur.fetchmany(2)
[]

Возникает ошибка ProgrammingError, если предыдущий вызов execute * () не дал никакого набора результатовили еще не было сделано никакого вызова.

Обратите внимание, что с параметром размера связаны некоторые соображения производительности.Для оптимальной производительности обычно лучше использовать атрибут arraysize.Если используется параметр размера, то лучше всего сохранить то же значение от одного вызова fetchmany () до следующего.

Элемент списка

fetchall ()

Получить все (оставшиеся) строки результата запроса, возвращая их в виде списка кортежей.Пустой список возвращается, если больше нет записей для извлечения.

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchall()
[(1, 100, "abc'def"), (2, None, 'dada'), (3, 42, 'bar')]

ProgrammingError вызывается, если предыдущий вызов execute * () не дал никакого набора результатов или еще не было выполнено никакого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...