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 la première (ne devrait en être qu'une en cas de correspondance)?
Utilisez query.one()
pour en obtenir un et exactement un résultat. 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()
, qui vous donnera juste le premier résultat de plusieurs, sans lever ces exceptions. Mais puisque vous voulez faire face au cas où il n'y a pas de résultat ou plus que vous ne le pensiez, query.one()
est exactement ce que vous devez utiliser.
Vous pouvez utiliser la fonction first()
sur l'objet Query. Cela retournera le premier résultat, ou Aucun s'il n'y a aucun résultat.
result = session.query(profile.name).filter(...).first()
if not result:
print 'No result found'
Vous pouvez également utiliser one()
, qui vous donnera le seul élément, mais déclenchera 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 () . Renvoyez au plus un résultat ou déclenchez une exception.
Renvoie None si la requête ne sélectionne aucune ligne.
En supposant que vous avez un utilisateur modèle, vous pouvez obtenir le premier résultat avec:
User.query.first()
Si la table est vide, elle renverra None.