web-dev-qa-db-fra.com

Gestion des erreurs dans SQLAlchemy

Comment gérez-vous les erreurs dans SQLAlchemy? Je suis relativement nouveau sur SQLAlchemy et je ne sais pas encore.

Avant d'utiliser SQLAlchemy, je faisais des choses comme

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Mais maintenant je code en SQLAlchemy et je fais des choses comme

user = User('Boda Cydo')
session.add(user)
session.commit()

Aucune vérification d'erreur que ce soit!

Je n'aime pas ce style de codage sans vérification d'erreur.

S'il vous plaît des conseils sur la façon de vérifier et de gérer les erreurs dans SQLAlchemy!

Cordialement, Boda Cydo.

41
bodacydo

Votre exemple dit:

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Cela semble vouloir dire que vous voulez lever une exception s'il y a une erreur sur la requête (avec raise Error, db.error). Mais sqlalchemy le fait déjà pour vous - donc

user = User('Boda Cydo')
session.add(user)
session.commit()

C'est pareil. La partie check-and-raise est déjà dans SQLAlchemy.

Voici une liste des erreurs que sqlalchemy lui-même peut soulever, tirées de help(sqlalchemy.exc) et help(sqlalchemy.orm.exc):

  • sqlalchemy.exc:
    • ArgumentError - Déclenché lorsqu'un argument de fonction non valide ou conflictuel est fourni. Cette erreur correspond généralement aux erreurs d'état de temps de construction.
    • CircularDependencyError - Augmenté par les tris topologiques lorsqu'une dépendance circulaire est détectée
    • CompileError - Déclenché lorsqu'une erreur se produit lors de la compilation SQL
    • ConcurrentModificationError
    • DBAPIError - Augmenté lorsque l'exécution d'une opération de base de données échoue. Si l'opération de génération d'erreur s'est produite lors de l'exécution d'une instruction SQL, cette instruction et ses paramètres seront disponibles sur l'objet d'exception dans les attributs statement et params. L'objet exception encapsulé est disponible dans l'attribut orig. Son type et ses propriétés sont spécifiques à l'implémentation DB-API.
    • DataError Encapsule une DB-API DataError.
    • DatabaseError - Encapsule une DB-API DatabaseError.
    • DisconnectionError - Une déconnexion est détectée sur une connexion DB-API brute. être levé par un PoolListener afin que le pool d'hôtes force une déconnexion.
    • FlushError
    • IdentifierError - Augmenté lorsqu'un nom de schéma dépasse la limite maximale de caractères
    • IntegrityError - Encapsule une DB-API IntegrityError.
    • InterfaceError - Encapsule une DB-API InterfaceError.
    • InternalError - Encapsule une DB-API InternalError.
    • InvalidRequestError - SQLAlchemy a été invité à faire quelque chose qu'il ne peut pas faire. Cette erreur correspond généralement aux erreurs d'état d'exécution.
    • NoReferenceError - Augmenté de ForeignKey pour indiquer qu'une référence ne peut pas être résolue.
    • NoReferencedColumnError - Augmenté de ForeignKey lorsque le Column référencé ne peut pas être localisé.
    • NoReferencedTableError - Augmenté de ForeignKey lorsque le Table référencé ne peut pas être localisé.
    • NoSuchColumnError - Une colonne inexistante est demandée à un RowProxy.
    • NoSuchTableError - La table n'existe pas ou n'est pas visible pour une connexion.
    • NotSupportedError - Encapsule une DB-API NotSupportedError.
    • OperationalError - Encapsule une DB-API OperationalError.
    • ProgrammingError - Encapsule une DB-API ProgrammingError.
    • SADeprecationWarning - Émis une fois par utilisation d'une API obsolète.
    • SAPendingDeprecationWarning - Émis une fois par utilisation d'une API obsolète.
    • SAWarning - Émis lors de l'exécution.
    • SQLAlchemyError - Classe d'erreur générique.
    • SQLError - Augmenté lorsque l'exécution d'une opération de base de données échoue.
    • TimeoutError - Augmenté lorsqu'un pool de connexions arrive à expiration lors de l'obtention d'une connexion.
    • UnboundExecutionError - SQL a été tenté sans connexion à la base de données pour l'exécuter.
    • UnmappedColumnError
  • sqlalchemy.orm.exc:
    • ConcurrentModificationError - Les lignes ont été modifiées en dehors de l'unité d'oeuvre.
    • FlushError - Une condition non valide a été détectée pendant flush().
    • MultipleResultsFound - Un seul résultat de base de données était requis mais plus d'un ont été trouvés.
    • NoResultFound - Un résultat de base de données était requis mais aucun n'a été trouvé.
    • ObjectDeletedError - Une opération refresh() n'a pas pu récupérer la ligne d'un objet.
    • UnmappedClassError - Une opération de mappage a été demandée pour une classe inconnue.
    • UnmappedColumnError - Une opération de mappage a été demandée sur une colonne inconnue.
    • UnmappedError - À FAIRE
    • UnmappedInstanceError - Une opération de mappage a été demandée pour une instance inconnue.
65
nosklo

J'ai essayé cela et cela m'a montré le message d'erreur spécifique.

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

except SQLAlchemyError as e:
  error = str(e.__dict__['orig'])
  return error

J'espère que cela t'aides

8
Toufiq

SQLAlchemy lèvera une exception en cas d'erreur ....

1
tholo