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?
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
.