2 سؤال: كيفية الوصول إلى خطأ psycopg2 ملفوفة في خطأ sqlalchemy

السؤال الذي تم إنشاؤه في Wed, May 8, 2019 12:00 AM

أقوم بتحميل إطار بيانات الباندا إلى جدول في Postgres باستخدام SQLalchemy و psycopg2. كيف يمكنني الوصول إلى خطأ psycopg2 الموجود في خطأ SQLalchemy؟

أرغب في كتابة استثناء في الشفرة الخاصة بي فقط عندما يثير خطأ نظرًا لوجود قيمة فارغة في عمود ينتهك التقييد غير الفارغ. أعرف كيفية اختبار هذا الخطأ الدقيق في pSQL باستخدام psycopg2 ، لكن عندما أقوم بتشغيل الشفرة الخاصة بي فإنها تُرجع خطأ SQLalchemy.

إليك الخطأ:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) قيمة فارغة في العمود ...

اقتباس فقرة>

إليك الاستثناء الضروري:

from sqlalchemy import exc

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

إليك ما أريد فعله:

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

أعرف أنه يمكنني اختبار sqlalchemy.exc.IntegrityEror.orig ، لكن هذا ليس نظيفًا أو دقيقًا مثل استخدام العضو pgcode.

    
0
2 إجابة                              2                         

كما أشرت في سؤالك ، يمكنك الوصول إلى الاستثناء الأساسي الذي أثارته dbapi من خلال السمة .orig لاستثناء SQLAlchemy.

يتم استثناء أي استثناء يتم رفعه بواسطة برنامج التشغيل ونشره من خلال SQLAlchemy بفئة فرعية من DBAPIError ، حيث تكون حالة المستندات:

  

يتوفر كائن الاستثناء المُلف في السمة الأصلية. ه   النوع والخصائص هما تطبيق DB-API خاص .

اقتباس فقرة>

(منجم التركيز)

الاطلاع على مستندات psycopg لقواعدها Error السمات التي يطلقون عليها هي pgcode:

  

سلسلة تمثل رمز الخطأ الذي تم إرجاعه بواسطة الواجهة الخلفية ، بلا إذا   غير متوفر. تحتوي الوحدة النمطية errorcodes على ثوابت رمزية   يمثل رموز خطأ PostgreSQL.

اقتباس فقرة>

لذا ، يبدو أن <sqla_exc>.orig.pgcode يبدو أنه يجب أن يحصل على ما تريده ، ولكن إذا لم توفر psycopg أي رمز لأي سبب من الأسباب في حالة الاستثناء الخاصة بها ، فليس من الممكن أن تتصدى له sqlalchemy لأنه لا يلتفت إلى الاستثناء ويمرر هذا لك.

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

إليك الرمز الأخير للرجوع إليه:

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
وضع مصدر هنا