web-dev-qa-db-fra.com

Syntaxe PostgreSQL / Psycopg2 upsert pour mettre à jour les colonnes

Je veux avoir la mise à jour Psycopg2 col1, col2 et col en cas de conflit d'identifiant.

Dans mon Python j'ai l'insertion SQL actuellement comme:

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

Fondamentalement au lieu de NE RIEN FAIRE Je veux définir:

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

Qui ignore l'insertion de l'ID et met à jour col1, col2 et col3. Le problème utilise %s pour passer des variables Tuple dans Python utilisant Psycopg2:

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

Quelle est la syntaxe utilisée pour faire référence à %s correspondant à col1, col2 et col3 pour mettre à jour ON CONFLICT?

5
Dobob

Vous pouvez utiliser le mot clé EXCLUDED pour accéder aux valeurs transmises à INSERT. Pas besoin de les passer deux fois:

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

Voir des exemples d'utilisation dans la documentation Postgres sur ON CONFLICT.

10
ypercubeᵀᴹ