Psycopg2 使用一个查询更新插入多行



我在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不会这样做,这就像一个接一个地循环使用所有这些字典进行查询一样。 如果没有冲突做更新,我可以做一些类似"insert into mytable (id, val) values " + ', '.join(['(%s, %s)'] * len(data))的事情并将数据转换为列表 [id1, val1, id2, val2, ...]。但是我不知道如何组合多个值来插入和更新语句。

我有同样的问题。搜索了一会儿,我找到了两个帖子:

  1. Posgresql - upsert: https://dba.stackexchange.com/questions/167591/postgresql-psycopg2-upsert-syntax-to-update-columns
  2. Psycopg2 - 插入多行:psycopg2:使用一个查询插入多行

=> 所以给你的答案是:

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

最新更新