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>]

Резюме:

  • Используйте result.scalars().all(), если запрос возвращает один объект или одну колонку, так как это упрощает работу с результатами.
  • Используйте result.all(), если запрос возвращает несколько объектов или колонок, чтобы сохранить все данные.