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...?

À mon humble avis, vous n'avez pas besoin de restaurer à la suite d'un échec de la validation. Vous devrez récupérer le code d'erreur avant la restauration; elle serait autrement probablement "pas de transaction en cours de restauration".
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