При работе с объектами 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) # Вывод: 4
row_count = sum(1 for _ in cursor.fetchall())
print(row_count) # Вывод: 4
fetchmany()
:
while True:
rows = cursor.fetchmany(1000)
if not rows:
break
row_count += len(rows)
print(row_count) # Вывод: 4