Потому что это итератор, использованный после первой команды.В таких случаях попробуйте сначала составить список:
results = list(SQLAlchemyResult.fetchall())
print(len(results))
print(len(results))
Вывод:
1
1
Что такое итератор?Это объект, который может создавать несколько значений.Может быть, у них есть все они уже внутри, может быть, он должен сделать определенную работу, чтобы произвести следующую.Например, у вас есть range(5)
.Это итератор.Попробуйте это:
print(range(5))
print(list(range(5)))
Вывод:
range(5)
[0, 1, 2, 3, 4]
Первая команда, которая только что называла __str__
метод объекта range
, и это была range(5)
.Второй сначала создал список - он принимает итерируемые объекты, которые реализовали __next__
.Этот __next__
возвращает значения до конца итератора.Затем, когда у нас есть список со всеми значениями из итератора, у нас просто распечатывается список.
Зачем нам это нужно?Поскольку некоторые данные могут нуждаться в вычислениях или являются слишком длинными, вы можете сначала обработать их, прежде чем запрашивать другую часть.Или, может быть, у вас есть камера и у вас есть итератор, который всегда выдает последний кадр (или ждет следующего).Это полезная концепция наряду с генераторами .