web-dev-qa-db-fra.com

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 la première (ne devrait en être qu'une en cas de correspondance)?

46
Asken

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.

83
Lukas Graf

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'
35
Mark Hildreth

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.

5
Shoham

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.

3
Aldo Canepa