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)?

37
demandé sur Lukas Graf 2013-08-07 21:36:09

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.

68
répondu Lukas Graf 2017-05-05 12:01:45

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'
32
répondu Mark Hildreth 2015-11-04 16:19:15

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.

4
répondu Shoham 2016-09-13 06:38:53