Почему разработчики SQLAlchemy решили возвращать в ответе массив с одним элементом вместо обычного значения при выборке первого результата из ORM таблицы?
Например, если у нас имеется такая выборка:
user = session.execute(select(User)).first()
Почему они посчитали что такой формат ответа:
user_name = user[0].name
будет лучше чем такой (ожидаемый мной результат):
user_name = user.name
Отвечает ли это на ваш вопрос? Почему возвращается кортеж?
Ни один из них не ответил на мой вопрос.
Я считаю, что это было сделано, чтобы сделать API более совместимым с основным API. Также это делает один аргумент совместимым с несколькими аргументами, т.е. select(User)
и select(User, Company.name).join(User.company)
оба возвращают строки, подобные namedtuple. В документах есть пояснение: rowproxy-больше-не-прокси-теперь-называется-строка-и-ведет-как-расширенный-именованный-кортеж
Обратите внимание, что вы можете использовать scalars()
для достижения предполагаемого использования.
Использование скаляров для особого случая
user = session.execute(select(User)).scalars().first()
По сравнению с этим типом использования
user, = session.execute(select(User)).first()
user, company_name = session.execute(select(User, Company.name).join(User.company)).first()
К вашему сведению, предпочтительным использованием SQLAlchemy 1.4+ является session.scalars(select(User))
. Он функционально эквивалентен session.execute(select(User).scalars()
, но немного компактнее. (Мы находимся в процессе обновления документации, чтобы отразить это.)
Ого, спасибо! Теперь это имеет больше смысла. Я думаю, что вы можете использовать session.scalars(select(User)).first()
и без .execute
.
это отвечает на ваш вопрос?