Graceful Primary Key Error handling in Python/psycopg2

后端 未结 2 696
没有蜡笔的小新
没有蜡笔的小新 2021-02-18 17:15

Using Python 2.7 and

In [150]: psycopg2.version Out[150]: \'2.4.2 (dt dec pq3 ext)\'

I have a simple python scripts that processing transaction

相关标签:
2条回答
  • 2021-02-18 17:18

    You should rollback transaction on error.

    I've added one more try..except..else construction in the code bellow to show the exact place where exception will occur.

    try:
        cur = conn.cursor()
    
        try:
            cur.execute("""insert into encounter_id_table (
                encounter_id,current_date  )
                values       
                (%(create_date)s, %(encounter_id)s ) ;""",
                'encounter_id':i.split('~')[1],  
                'create_date': datetime.date.today() })
        except psycopg2.IntegrityError:
            conn.rollback()
        else:
            conn.commit()
    
        cur.close() 
    except Exception , e:
        print 'ERROR:', e[0]
    
    0 讨论(0)
  • 2021-02-18 17:22

    First of all: CURRENT_DATE is a reserved word in every SQL standard as well as in PostgreSQL. You cannot use it as identifier without double-quoting it. I would strongly advice not to use it at all. I renamed the column to curdate in my example

    Next, I am no expert in python syntax, but you seem to have reversed the order of your insert-columns:

    (%(create_date)s, %(encounter_id)s )
    

    Should be:

    ( %(encounter_id)s, %(create_date)s)
    

    To your main question: you can avoid the problem altogether by checking if the key is already in the table before using it in the insert command:

    INSERT INTO encounter_id_table (encounter_id, curdate)
    SELECT 1234, now()::date
    WHERE  NOT EXISTS (SELECT * FROM encounter_id_table t
                       WHERE t.encounter_id = 1234);
    

    In Python syntax, that should be:

    cur.execute("""INSERT INTO encounter_id_table (encounter_id, curdate)
        SELECT %(encounter_id)s, %(create_date)s,
        WHERE  NOT EXISTS (
               SELECT * FROM encounter_id_table t
               WHERE t.encounter_id = %(encounter_id)s);""",
      {'encounter_id':i.split('~')[1],  
      'create_date': datetime.date.today()})       
    
    0 讨论(0)
提交回复
热议问题