我正在使用psycopg2将命令插入到postgres数据库,并且当有冲突时,我只想更新其他列值。
这是查询:
insert_sql = '''
INSERT INTO tablename (col1, col2, col3,col4)
VALUES (%s, %s, %s, %s) (val1,val2,val3,val4)
ON CONFLICT (col1)
DO UPDATE SET
(col2, col3, col4)
= (val2, val3, val4) ; '''
cur.excecute(insert_sql)
我想找到我做错了什么?我使用的不是实际值val1,val2,val3。
引用psycopg2的文档:
警告从不,从不,从不使用Python字符串串联(+)或字符串参数插值(%)将变量传递给SQL查询字符串。甚至没有枪口。
现在,对于upsert操作,您可以执行以下操作:
insert_sql = '''
INSERT INTO tablename (col1, col2, col3, col4)
VALUES (%s, %s, %s, %s)
ON CONFLICT (col1) DO UPDATE SET
(col2, col3, col4) = (EXCLUDED.col2, EXCLUDED.col3, EXCLUDED.col4);
'''
cur.execute(insert_sql, (val1, val2, val3, val4))
请注意,查询的参数将作为元组传递给该execute
语句(这确保psycopg2在保护您免受注入攻击的同时,将使它们适应SQL。)
该EXCLUDED
位允许您重用这些值,而无需在data参数中指定两次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句