Psycopg2を更新したいcol1、col2および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
を参照するために使用される構文は何ですか?
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ドキュメントの使用例を参照してください。