web-dev-qa-db-ja.com

列を更新するためのPostgreSQL / Psycopg2アップサート構文

Psycopg2を更新したいcol1col2およびcol IDの競合がある場合。

私のPythonコードで私は現在次のように挿入SQLを持っています:

insert_sql = '''INSERT INTO {t} (id,col1,col2,col3)
        VALUES (%s,%s,NULLIF(%s, 'nan'), NULLIF(%s, 'nan'))
        ON CONFLICT (id)
        DO NOTHING;'''

基本的にはDO NOTHINGの代わりに設定したい:

(col1,col2,col3) = (%s,NULLIF(%s, 'nan'), NULLIF(%s, 'nan'))

これは、IDの挿入を無視し、col1、col2、およびcol3を更新します。問題は%sを使用してタプル変数をPython= Psycopg2を使用して渡すことです。

cur.execute(insert_sql.format(t='my_table'),(int(id),new_col1,new_col2,new_col3))

ON CONFLICTを更新するためにcol1、col2、およびcol3に対応する%sを参照するために使用される構文は何ですか?

5
Dobob

EXCLUDEDキーワードを使用して、INSERTに渡された値にアクセスできます。それらを2回渡す必要はありません。

insert_sql = '''
   INSERT INTO {t} (id,col1, col2, col3)
        VALUES (%s, %s, NULLIF(%s, 'nan'), NULLIF(%s, 'nan'))
        ON CONFLICT (id)
        DO UPDATE SET
            (col1, col2, col3)
            = (EXCLUDED.col1, EXCLUDED.col2, EXCLUDED.col3) ;
'''

ON CONFLICTに関するPostgresドキュメントの使用例を参照してください。

10
ypercubeᵀᴹ