Postgresql

PostgreSQL/Psycopg2 upsert 語法來更新列

  • March 16, 2018

當 id 發生衝突時,我想讓 Psycopg2 更新col1col2col3 。

在我的 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使用 Psycopg2 在 Python 中傳遞元組變數:

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

用於引用%scol1、col2 和 col3 對應的語法以更新 ON CONFLICT?

您可以使用EXCLUDED關鍵字訪問傳遞給的值INSERT。無需通過它們兩次:

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) ;
'''

請參閱 Postgres 文件中有關**ON CONFLICT**.

引用自:https://dba.stackexchange.com/questions/167591