Взято из MySQL документации :
Метод fetchone () используется fetchall () и fetchmany (). Он также используется, когда курсор используется в качестве итератора.
В следующем примере показаны два эквивалентных способа обработки результата запроса. Первый использует fetchone () некоторое время l oop, второй использует курсор в качестве итератора:
# Using a while loop
cursor.execute("SELECT * FROM employees")
row = cursor.fetchone()
while row is not None:
print(row)
row = cursor.fetchone()
# Using the cursor as iterator
cursor.execute("SELECT * FROM employees")
for row in cursor:
print(row)
Также указано, что:
Вы должны получить все строки для текущего запроса перед выполнением новых операторов с использованием того же соединения.
Если вас беспокоят проблемы с производительностью, вы должны использовать fetchmany(n)
через некоторое время l oop, пока не получите все результаты вот так:
'An iterator that uses fetchmany to keep memory usage down'
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result
Это поведение соответствует PEP249 , в котором описывается, как и какие методы должны реализовывать соединители БД. Частичный ответ дан в этом потоке .
В основном реализация fetchall vs fetchmany vs fetchone будет зависеть от разработчиков библиотеки в зависимости от возможностей базы данных, но это будет иметь смысл в случае fetchmany и fetchone, что невыполненные / оставшиеся результаты будут сохраняться на стороне сервера, пока не будет запрошен другой вызов или уничтожение объекта курсора.
Итак, в заключение я думаю, что безопасно Предположим, что вызов метода execute в этом случае (mysqldb) не выводит все данные из запроса в память.