Obtenir la première ligne de sqlalchemy
J'ai la requête suivante:
profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))
Comment puis-je vérifier s'il y a une ligne et comment puis-je simplement retourner le premier (ne devrait être qu'un s'il y a une correspondance)?
3 réponses
Utiliser query.one()
pour l'obtenir, et exactement une suite. Dans tous les autres cas, il déclenchera une exception que vous pouvez gérer:
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
Il y a aussi query.first()
, ce qui vous donnera juste le premier résultat de peut-être beaucoup, sans soulever ces exceptions. Mais puisque vous voulez faire face au cas où il n'y aurait pas de résultat ou plus que vous ne le pensiez, query.one()
est exactement ce que vous devriez utiliser.
Vous pouvez utiliser le first()
la fonction de l'objet de Requête. Cela renverra le premier résultat, ou aucun s'il n'y a pas de résultats.
result = session.query(profile.name).filter(...).first()
if not result:
print 'No result found'
Sinon, vous pouvez utiliser one()
, ce qui vous donnera le seul élément, mais lever des exceptions pour une requête avec zéro ou plusieurs résultats.
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'
Utilisez one_or_none () . Renvoie au plus un résultat ou déclenche une exception.
Renvoie None si la requête ne sélectionne aucune ligne.