При работе с объектами SQLite3 в Python следует учитывать любопытное поведение функции len().
cursor.fetchall()Когда вы вызываете cursor.fetchall(), он возвращает список кортежей со строками результатов из запроса. Например, следующий код выбирает столбец name из таблицы users:
cursor.execute("SELECT name FROM users")
result = cursor.fetchall()
Применение len() к result возвращает количество кортежей в списке:
print(len(result)) # Вывод: 4
Однако при передаче длины в переменную n и последующей ее печати выводится 0. Это происходит потому, что вызов cursor.fetchall() извлекает все строки из результата в память, а не хранит результат как ленивый итератор.
n = len(cursor.fetchall())
print(n) # Вывод: 0
Чтобы передать длину в переменную, выполните одно из следующих действий:
row_count = 0
for row in cursor.fetchall():
row_count += 1
print(row_count) # Вывод: 4row_count = sum(1 for _ in cursor.fetchall())
print(row_count) # Вывод: 4fetchmany():
while True:
rows = cursor.fetchmany(1000)
if not rows:
break
row_count += len(rows)
print(row_count) # Вывод: 4