我在Postgresql中有带有字段id
(唯一)和val
的表。
我想执行以下操作:
INSERT INTO my_table (id, val)
VALUES (%(id)s, %(val)s)
ON CONFLICT(id) DO UPDATE
SET val = val + %(val)s
要插入的数据类似于[{"id": 123, "val": 5}, {"id": 456, "val": 8}, ...]
。有什么方法可以通过一个查询来增加所有这些?
cursor.executemany
不会执行此操作,这与对所有这些dict依次进行查询一样。
如果没有ON CONFLICT DO UPDATE,我可以做类似"insert into mytable (id, val) values " + ', '.join(['(%s, %s)'] * len(data))
的事情并将数据转换为列表[id1,val1,id2,val2,...]。但是我不知道如何组合多个值来插入和更新语句。
答案 0 :(得分:2)
我有同样的问题。经过一段时间的搜索,我发现了两个帖子:
=>因此,您的答案是:
# my table: cas(address, id, description) - address is primary key
data = [('0x18f9f00a432F50c6E2429d31776724d3cB873BEF', '1000', 'mot ngan'),
('0x06471C53CE649Eb4dA88b792D500544A7E5C9635', '2000', 'hai ngan')]
args = [cur.mogrify('(%s, %s, %s)', x).decode('utf-8')
for x in data]
args_str = ', '.join(args)
cur.execute('''INSERT INTO cas (address, id, description) VALUES'''
+ args_str +
'''ON CONFLICT (address) DO UPDATE SET
(address, id, description) = (EXCLUDED.address, EXCLUDED.id, EXCLUDED.description)''')