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.
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éeCompileError
- Déclenché lorsqu'une erreur se produit lors de la compilation SQLConcurrentModificationError
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èresIntegrityError
- 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
- À FAIREUnmappedInstanceError
- Une opération de mappage a été demandée pour une instance inconnue.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
SQLAlchemy lèvera une exception en cas d'erreur ....