2 Question: Comment accéder à l'erreur psycopg2 encapsulée dans l'erreur sqlalchemy

question créée à Wed, May 8, 2019 12:00 AM

Je télécharge un bloc de données de pandas dans une table Postgres à l'aide de SQLalchemy et psycopg2. Comment accéder à l'erreur psycopg2 contenue dans l'erreur SQLalchemy?

Je souhaite écrire une exception dans mon code uniquement lorsqu'il génère une erreur en raison d'une valeur NULL dans une colonne qui ne respecte pas la contrainte non NULL. Je sais comment tester cette erreur pSQL exacte avec psycopg2, mais lorsque je lance mon code, une erreur SQLalchemy est renvoyée.

Voici l'erreur:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) valeur null dans la colonne ...

Voici l'exception nécessaire:

from sqlalchemy import exc

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError:

Voici ce que je veux faire:

from sqlalchemy import exc
import psycopg2

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError as ex:
    ex = ex.psycopg2error
    if ex.pgcode == '23502'
        print('Data not uploaded: null value in a column violates non-null constraint')
    else:
        raise

Je sais que je peux tester sqlalchemy.exc.IntegrityEror.orig, mais ce n'est pas aussi propre ni si affiné que d'utiliser le membre pgcode.

    
0
2 réponses                              2                         

Comme vous l'avez indiqué dans votre question, vous pouvez accéder à l'exception sous-jacente générée par le dbapi via l'attribut 0600350991111101035062 de l'exception SQLAlchemy.

Toute exception d√©clench√©e par le pilote et propag√©e via SQLAlchemy est encapsul√©e dans une sous-classe de 0600350991111101035062 , o√Ļ l‚Äô√©tat de la documentation est:

  

L'objet exception encapsulé est disponible dans l'attribut orig. Son   le type et les propriétés sont spécifiques à l'implémentation DB-API .

(c'est moi qui souligne)

Consultation des documents psycopg pour leur base 0600350991111101035062 . les attributs qu’ils nomment sont 0600350991111101035062:

  

Cha√ģne repr√©sentant le code d'erreur renvoy√© par le serveur, Aucune si ¬†¬†indisponible. Le module errorcodes contient des constantes symboliques ¬†¬†repr√©sentant les codes d'erreur PostgreSQL.

Ainsi, 06003509911111010335062 devrait obtenir ce que vous cherchez, mais si, pour une raison quelconque, psycopg ne rend pas son code disponible dans son état d'exception, ce n'est pas vraiment quelque chose que sqlalchemy peut adresser car il enveloppe simplement leur exception et le passe à vous.

    
2
2019-05-09 00: 47: 07Z

Voici mon code final pour référence:

.orig     
1
2019-05-10 15: 22: 15Z
DBAPIError
source placée ici