86 votes

sqlalchemy existe pour la requête

Comment vérifier si les données d'une requête existent ?

Par exemple:

 users_query = User.query.filter_by(email='x@x.com')

Comment puis-je vérifier s'il existe des utilisateurs avec cet e-mail ?

je peux vérifier ça avec

 users_query.count()

mais comment le vérifier avec existe ?

102voto

Cito Points 2077

La solution suivante est un peu plus simple :

 from sqlalchemy.sql import exists

print session.query(exists().where(User.email == '...')).scalar()

43voto

Eugene Kovalev Points 924

L'option la plus acceptable et la plus lisible pour moi est

 session.query(<Exists instance>).scalar()

Comme

 session.query(User.query.filter(User.id == 1).exists()).scalar()

qui renvoie True ou False .

16voto

Gary van der Merwe Points 2913

À ma connaissance, il n'y a aucun moyen de le faire en utilisant l'API de requête orm. Mais vous pouvez descendre à un niveau inférieur et utiliser existe à partir de sqlalchemy.sql.expression :

 from sqlalchemy.sql.expression import select, exists

users_exists_select = select((exists(users_query.statement),)) 
print engine.execute(users_exists_select).scalar()

4voto

MarredCheese Points 2206

Pour SQL Server , j'ai dû faire ceci :

 from sqlalchemy.sql.expression import literal

result = session.query(literal(True)).filter(
    session.query(User)
    .filter_by(email='...')
    .exists()
).scalar()
print(result is not None)

# Resulting query:
# SELECT 1
# WHERE EXISTS (SELECT 1 
# FROM User
# WHERE User.email = '...')

Mais c'est beaucoup plus simple sans EXISTS :

 result = (
    session.query(literal(True))
    .filter(User.email == '...')
    .first()
)
print(result is not None)

# Resulting query:
# SELECT TOP 1 1
# FROM User
# WHERE User.email = '...'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X