Graceful Primary Key Error handling in Python/psycopg2

后端 未结 2 726
没有蜡笔的小新
没有蜡笔的小新 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: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()})       
    

提交回复
热议问题