Получение первой строки из sqlalchemy
У меня есть следующий запрос:
profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))
Как проверить, есть ли строка и как я могу просто вернуть первый (должен быть только один, если есть совпадение)?
Ответы
Ответ 1
Используйте query.one()
, чтобы получить один и ровно один результат. Во всех остальных случаях это вызовет исключение, которое вы можете обработать:
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.exc import MultipleResultsFound
try:
user = session.query(User).one()
except MultipleResultsFound, e:
print e
# Deal with it
except NoResultFound, e:
print e
# Deal with that as well
Там также query.first()
, который даст вам только первый результат, возможно, многих, не поднимая эти исключения. Но так как вы хотите иметь дело с тем, что нет результата или больше, чем вы думали, query.one()
- это именно то, что вы должны использовать.
Ответ 2
Вы можете использовать функцию first()
объекта Query. Это вернет первый результат или None, если результатов нет.
result = session.query(profile.name).filter(...).first()
if not result:
print 'No result found'
В качестве альтернативы вы можете использовать one()
, который даст вам единственный элемент, но вызывает исключения для запроса с нулевым или несколькими результатами.
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
try:
result = session.query(profile.name).filter(...).one()
print result
except NoResultFound:
print 'No result was found'
except MultipleResultsFound:
print 'Multiple results were found'
Ответ 3
Используйте one_or_none(). Возвратитесь не более одного результата или создайте исключение.
Возвращает None, если запрос не выбирает строки.
Ответ 4
Предполагая, что у вас есть модель User, вы можете получить первый результат с помощью:
User.query.first()
Если таблица пуста, она вернет None.