AI Notes
January 22
SQLAlchemy: разница между result.scalars().all() и result.all()
Разница между result.scalars().all()
и result.all()
заключается в том, как эти методы обрабатывают результат выполнения запроса SQLAlchemy. Они возвращают разные типы данных, что влияет на удобство работы с результатами.
1. result.all()
- Возвращает список кортежей, где каждый кортеж представляет строку результата запроса.
- Используется, если в запросе есть несколько столбцов или вы явно запрашиваете несколько объектов.
Пример:
query = select(UserAdm, ChatAdm).join(Link, Link.user_id == UserAdm.id).join(ChatAdm, Link.chat_id == ChatAdm.id) result = await session.execute(query) data = result.all() print(data) # [(<UserAdm>, <ChatAdm>), (<UserAdm>, <ChatAdm>)]
- Когда запрос возвращает несколько объектов или столбцов в строке.
- Если нужна информация обо всех возвращённых данных.
2. result.scalars().all()
- Возвращает список объектов из одной конкретной колонки (или объекта), заданной в
select()
. - Если вы запрашиваете только один объект или колонку, этот метод "распаковывает" результаты, убирая обёртку кортежей.
Пример:
query = select(ChatAdm).join(Link, Link.chat_id == ChatAdm.id) result = await session.execute(query) data = result.scalars().all() print(data) # [<ChatAdm>, <ChatAdm>]
- Когда запрос возвращает один объект или одну колонку.
- Это делает код чище, так как нет необходимости разбирать кортежи.
Ключевые различия:
Метод: result.all()
Возвращаемое значение: Список кортежей (строк результата запроса)
Когда использовать: Если запрос возвращает несколько объектов или колонок.
Метод: result.scalars().all()
Возвращаемое значение: Список объектов или значений из одной выбранной колонки.
Когда использовать: Если нужен только один объект или колонка.
Пример для сравнения:
# Запрос с несколькими столбцами query = select(UserAdm, ChatAdm).join(Link, Link.user_id == UserAdm.id).join(ChatAdm, Link.chat_id == ChatAdm.id) result = await session.execute(query) # Используем result.all() data_all = result.all() print(data_all) # [(<UserAdm>, <ChatAdm>), (<UserAdm>, <ChatAdm>)] # Используем result.scalars().all() data_scalars = result.scalars().all() # Ошибка, так как запрос возвращает несколько столбцов
# Запрос с одним объектом query = select(ChatAdm).join(Link, Link.chat_id == ChatAdm.id) result = await session.execute(query) # Используем result.all() data_all = result.all() print(data_all) # [(<ChatAdm>,), (<ChatAdm>,)] # Используем result.scalars().all() data_scalars = result.scalars().all() print(data_scalars) # [<ChatAdm>, <ChatAdm>]