Comment attraper erreur 1062 “double entrée” indépendante de la base de données utilisée/moteur?
Dans un projet, j'ai commencé avec MySQL comme base de données. Au lieu de vérifier d'abord, je viens de faire un insert et si je reçois un IntegrityError exception avec le code 1062, je sais qu'il y a une double entrée et d'avertir l'utilisateur, à faire ceci et cela.
qui ressemble un peu comme ceci:
try:
# add duplicate, nothing bad happens yet, is only in sqla session
db.session.add(User(email='already_used_email@address_that_has_to_be_unique.com'))
# commit, now the IntegrityError is raised, when sqla inserts
db.session.commit()
except IntegrityError as e:
db.session.rollback()
# this is what i do with mysql, check the exception for code 1062
# how can i replace this with something db independent?
code, msg = e.orig
if code == 1062:
# send warning
pass
Maintenant, pour l'un, de ce fait, il est déjà impossible de tester avec par exemple. sqlite en mémoire. Pas très agréable, mais je pourrais vivre avec ça.
Deuxième toutefois, pourrais-je (devoir/vouloir pour les autres hors de portée de cette question) commutateur à Postgres. Bien sûr, je pourrais juste changer le code (aussi) vérifier Postgres les codes d'erreur, mais j'espérais qu'il y est un moyen d'avoir de SQLALchemy dites-moi, qu'un double qui s'est passé indépendant de la base de données. Une base de données dialecte de l'abstraction...?
Je me souviens que, quand je n'ai pas fais une restauration de la base de données s'est plaint d'un peu claire de l'état de la session (ou était-ce sqlalchemy de se plaindre, je ne suis pas sûr). De toute façon, je ne capture de l'erreur avant de la restauration! Le IntegrityError est soulevée par le commettre, quand j'ai inséré un double de l'avant. Je vais mettre à jour l'exemple, pour montrer l'insert.
Peut être que l'état est undifined. Dans ce cas, vous devez d'abord obtenir l'erreur de l'état de réinitialisation de l'état, de la restauration, et peut-être voir l'erreur résultant de cette opération, trop.
OriginalL'auteur Florian | 2011-11-09
Vous devez vous connecter pour publier un commentaire.
Ce que vous recherchez est quelque chose qui s'appelle "SQLSTATE" - un ensemble de codes d'erreur standard dans la plupart des communes SGBDR états d'erreur. Ils n'ont pas nécessairement de fournir suffisamment de détails pour toutes les fins que, et je ne sais pas si sqlite les prend en charge.
Comme Michael Bayer écrit (mail-archive.com/[email protected]/...) l'obtention de la SQLSTATE via des exceptions n'est pas dans le champ d'application de sqlalchemy, mais le sous-jacent de la bibliothèque db. Il semble MySQLdb ne livre pas, comme
exc.orig
ne contient(1062, "Duplicate entry 'xxx' for key 'ix_yyy")
. Je vais m'en tenir à Michael recommandation du juste attraperIntegrityError
et envoyer l'original du message d'erreur à l'utilisateur.OriginalL'auteur Richard Huxton
Semble assez facile:
De creuser dans le module MySQLdb connections.py j'ai trouvé qu'il soulève à la fois un errorclass et un errorvalue. Vous pouvez donc avoir votre instruction try catch la catégorie désirée, puis les conditions d'utilisation de la poignée de la valeur de l'erreur de 1062 sinon, continuer à élever l'erreur..
connections.py
OriginalL'auteur Logic1