2 Soalan: Bagaimana untuk mengakses kesilapan psycopg2 yang dibungkus dalam kesilapan sqlalchemy

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya memuat naik bingkai data panda ke meja dalam Postgres menggunakan SQLalchemy dan psycopg2. Bagaimanakah saya mengakses ralat psycopg2 yang berada di dalam ralat SQLalchemy?

Saya ingin menulis pengecualian ke dalam kod saya hanya apabila ia menimbulkan ralat kerana nilai nol dalam lajur yang melanggar kekangan tidak-null. Saya tahu bagaimana untuk menguji ralat pSQL yang tepat dengan psycopg2, tetapi apabila saya menjalankan kod saya ia akan mengembalikan ralat SQLalchemy.

Inilah ralat:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) nilai null dalam lajur ...

Berikut adalah pengecualian yang diperlukan:

from sqlalchemy import exc

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

Inilah yang saya mahu lakukan:

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

Saya tahu saya boleh menguji sqlalchemy.exc.IntegrityEror.orig, tetapi itu tidak bersih atau halus kerana menggunakan ahli pgcode.

    
0
2 Jawapan                              2                         

Seperti yang telah anda katakan dalam soalan anda, anda boleh mengakses pengecualian yang dibangkitkan oleh dbapi melalui .orig atribut pengecualian SQLAlchemy.

Sebarang pengecualian yang dibangkitkan oleh pemandu dan disebarkan melalui SQLAlchemy dibalut oleh subclass DBAPIError , di mana dokumen itu menyatakan:

  

Objek pengecualian dibungkus tersedia dalam atribut orig. Its   jenis dan sifatnya adalah pelaksanaan DB-API khusus .

(penekanan saya)

Melihat dokumen psycopg untuk asas mereka Error salah satu daripada atribut yang mereka namakan ialah pgcode:

  

String mewakili kod ralat yang dikembalikan oleh backend, Tiada jika   tidak boleh didapati. Modul kesalahan kod mengandungi pemalar simbolik   mewakili kod ralat PostgreSQL.

Jadi, <sqla_exc>.orig.pgcode sepertinya ia sepatutnya mendapat apa yang anda cari, tetapi jika atas sebab apa pun psycopg tidak membuat kod mereka tersedia dalam keadaan pengecualian mereka, ia tidak benar-benar sesuatu yang dapat dijelaskan sqlalchemy kerana ia hanya membungkus pengecualian dan pas mereka ia kepada anda.

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

Berikut ialah kod terakhir saya untuk rujukan:

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
sumber diletakkan di sini