80 votes

Comment vérifier élégamment l'existence d'un objet/instance/variable et lui attribuer simultanément une variable si elle existe en python ?

Je utilise SQLAlchemy pour peupler une base de données et souvent j'ai besoin de vérifier si un objet orm existe dans une base de données avant de le traiter. Cela peut être une question non conventionnelle, mais je me suis souvent retrouvé confronté à ce schéma :

my_object = session.query(SomeObject).filter(some_fiter).first()
if my_object: # Mostly in databases...
    # Hourra il existe
    # traiter
else:
    # Il n'existe pas. :-(
    my_object = SomeObject()
    # traiter

Ce que je rêve serait quelque chose comme :

if my_object = session.query(someObject).blabla.first():
    # si my_object est None, ce domaine reste inchangé
    # si my_object n'est pas None, je peux travailler avec my_object ici...

Je sais que cette syntaxe est incorrecte, mais je voulais expliquer ce que je veux dire par cet exemple. Toute façon équivalente me rendrait heureux.

Existe-t-il une approche python élégante pour ce schéma ? Cette question vise non seulement SQLAlchemy, mais chaque scénario équivalent.

fermer les yeux en appuyant sur "Publier votre question" et en attendant que les gens intelligents et les pythonistas de coeur me pourchassent pour avoir posé quelque chose peut-être inapproprié ;-)

2voto

artillery129 Points 1
if DBSession.query(ObjectType).filter(ObjectType.some_parametter == "This").first() is None:

Ceci est une façon efficace d'une seule ligne pour vérifier si un enregistrement existe. C'est efficace car il ne récupère que le premier objet, et cela peut être sur une seule ligne car first() renvoie None lorsqu'il n'y a pas d'enregistrements correspondants. J'espère que cela aide!

2voto

bass chuck Points 57

Vous pouvez utiliser ceci :

sth = session.query.filter_by().first()
if sth is None:
    ....
else:
    ....

Je l'ai testé. Cela fonctionne bien.

1voto

suripoori Points 121

De bonnes suggestions ici. Que diriez-vous d'utiliser l'exception NoResultFound?

try:
    existing = dbsession.query(SomeObject).filter_by(value=value).one()
    return existing
except sqlalchemy.orm.exc.NoResultFound:
    obj = SomeObject()

0voto

Umar Hayat Points 21

Voici la fonction pour vérifier l'existence d'un objet en utilisant SQLalchemy.

def existe(obj, **kwargs):
    """" si l'objet filtré par kwargs existe, le renvoyer sinon renvoyer None
        obj : est l'objet du modèle SQL Alchemy dont l'existence est vérifiée ici.
        **kwargs : (username = user_name, email=user_email)
    """
    db_obj = obj.query.filter_by(**kwargs).first()
    if db_obj is not None:
        return True
    else:
        return False

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