Разница между .scalars().all() и списком(...scalars()) в SQLAlchemy

Существуют ли какие-либо существенные различия (в производительности или иным образом) между следующими двумя способами получения списка результатов?

users: Sequence[User] = session.execute(select(User)).scalars().all()
users: Sequence[User] = list(session.execute(select(User)).scalars())

Второй мне кажется более питоническим и возможен, потому что ScalarResult выполняет итерацию по своим строкам, поэтому вызов list(...scalars()) просто перебирает объект ScalarResult. Однако, поскольку .all() тоже существует, я предполагаю, что для этого должна быть какая-то причина, так что, может быть, более эффективно использовать .all()?

Каковы различия между ними и что происходит за кулисами, что вызывает эту разницу?

Вопросы и ответы на GitHub здесь

Gord Thompson 03.07.2024 23:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на источник, кажется, что разница есть. Вызывая ScalarResult.all(), он в конечном итоге вызывает ResultInternal._allrows() . Тем временем ScalarResult.__iter__() (который list() является внутренним вызовом) он в конечном итоге вызывает ResultInternal._iterator_getter().

Хотя на первый взгляд может показаться, что между этими методами много дублирования, есть одно ключевое отличие: .all() извлекает результаты за один раз, а .__iter__() передает результаты один за другим.

Метод итератора может быть полезен в тех случаях, когда вам может потребоваться короткое замыкание и вы знаете, что вам не нужен полный набор результатов. Но этот пример как бы растрачивает это.

Что касается производительности, между ними много слоев, поэтому их сложнее комментировать. Но с точки зрения использования SQLAlchemy я бы сказал, что .all() предпочтительнее для этого варианта использования.

Другие вопросы по теме