2 Frage: So greifen Sie auf den in sqlalchemy error eingeschlossenen Fehler psycopg2 zu

Frage erstellt am Wed, May 8, 2019 12:00 AM

Ich lade einen Pandadatenrahmen mit SQLalchemy und psycopg2 in eine Tabelle in Postgres hoch. Wie greife ich auf den Fehler psycopg2 zu, der im Fehler SQLalchemy enthalten ist?

Ich möchte eine Ausnahme nur dann in meinen Code schreiben, wenn sie einen Fehler aufgrund eines Nullwerts in einer Spalte auslöst, der die Nicht-Null-Einschränkung verletzt. Ich weiß, wie ich mit psycopg2 auf diesen genauen pSQL-Fehler testen kann, aber wenn ich meinen Code ausführe, wird ein SQLalchemy-Fehler zurückgegeben.

Hier ist der Fehler:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) Nullwert in Spalte ...

Hier ist die notwendige Ausnahme:

from sqlalchemy import exc

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

Folgendes möchte ich tun:

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

Ich weiß, dass ich sqlalchemy.exc.IntegrityEror.orig testen kann, aber das ist nicht so sauber oder feinkörnig wie die Verwendung des Mitglieds pgcode.

    
0
2 Antworten                              2                         

Wie Sie in Ihrer Frage bereits ausgeführt haben, können Sie über das Attribut .orig der SQLAlchemy-Ausnahme auf die vom DBAPI ausgelöste zugrunde liegende Ausnahme zugreifen.

Jede Ausnahme, die vom Treiber ausgelöst und über SQLAlchemy verbreitet wird, wird von einer Unterklasse von DBAPIError . Der Dokumentstatus lautet:

  

Das umschlossene Ausnahmeobjekt ist im orig-Attribut verfügbar. Es ist   Typ und Eigenschaften sind spezifisch für die DB-API-Implementierung .

(Hervorhebung von mir)

Betrachten Sie die Psycopg-Dokumente für ihre Basis Error Die von ihnen benannten Attribute lauten pgcode:

  

String, der den vom Backend zurückgegebenen Fehlercode darstellt, None if   Nicht verfügbar. Das Errorcodes-Modul enthält symbolische Konstanten   Darstellen von PostgreSQL-Fehlercodes.

Also, <sqla_exc>.orig.pgcode sieht so aus, als ob es das bekommen sollte, wonach Sie suchen, aber wenn psycopg aus irgendeinem Grund den Code nicht in ihrem Ausnahmezustand verfügbar macht, ist es nicht wirklich etwas, das sqlalchemy adressieren kann, da es nur ihre Ausnahme umschließt und übergibt es dir an.

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

Hier ist mein endgültiger Referenzcode:

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.DBAPIError as ex:
    if ex.orig.pgcode == '23502':
        print("Data could not be uploaded to sql_table: " + ex.orig.diag.message_primary)
    else:
        raise
    
1
2019-05-10 15: 22: 15Z
Quelle platziert Hier