Python psycopg2 在冲突时插入和更新 - 为现有 ID 和基于条件设置数据
Python psycopg2 insert and update on conflict - set data for existed id and based on condition
我有一个 table,其中的列如下:(id, col1, col2, col3, col4)
。我需要向这个 table 插入新行,给定的数据是一个字典:例如 data = {'id': 1, 'col1': 1, 'col2':1, 'col3':1, 'col4': 1}
。
如果 id 不存在,我想使用下面的查询将数据插入 table,或者如果 id 存在,则更新 table:
query =
'''
INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO UPDATE SET
col2 = col2 + 1;
'''
result = cur.execute(query, data)
我可以将数据传递到 Insert 块中,但是在进行更新时使用 On Conflict 块,col2 = col2 + data['col2] 引发错误 column referance "col2" is ambiguous
。
另一个问题是如何根据其他列的条件更新 col2 值,例如:
col2 = col2 + 1 if col1 == data['col1] else col2 = col2
考虑将您的词典项目重新用作附加参数,并使用 table 名称作为别名:
query = '''INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO
UPDATE SET col2 = tablename.col2 + %(col2)s;
'''
result = cur.execute(query, data)
事实上,您可以使用 excluded
别名:
...
UPDATE SET col2 = tablename.col2 + excluded.col2;
对于条件逻辑,使用 CASE
语句:
query = '''INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO
UPDATE SET col2 = CASE
WHEN tablename.col1 = %(col1)s
THEN tablename.col2 + 1
ELSE tablename.col2
END;
'''
result = cur.execute(query, data)
同样,您可以使用 excluded
别名:
...
CASE
WHEN tablename.col1 = excluded.col1
THEN tablename.col2 + 1
ELSE tablename.col2
END;
我有一个 table,其中的列如下:(id, col1, col2, col3, col4)
。我需要向这个 table 插入新行,给定的数据是一个字典:例如 data = {'id': 1, 'col1': 1, 'col2':1, 'col3':1, 'col4': 1}
。
如果 id 不存在,我想使用下面的查询将数据插入 table,或者如果 id 存在,则更新 table:
query =
'''
INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO UPDATE SET
col2 = col2 + 1;
'''
result = cur.execute(query, data)
我可以将数据传递到 Insert 块中,但是在进行更新时使用 On Conflict 块,col2 = col2 + data['col2] 引发错误 column referance "col2" is ambiguous
。
另一个问题是如何根据其他列的条件更新 col2 值,例如:
col2 = col2 + 1 if col1 == data['col1] else col2 = col2
考虑将您的词典项目重新用作附加参数,并使用 table 名称作为别名:
query = '''INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO
UPDATE SET col2 = tablename.col2 + %(col2)s;
'''
result = cur.execute(query, data)
事实上,您可以使用 excluded
别名:
...
UPDATE SET col2 = tablename.col2 + excluded.col2;
对于条件逻辑,使用 CASE
语句:
query = '''INSERT INTO tablename (id, col1, col2, col3, col4)
VALUES (%(id)s, %(col1)s, %(col2)s, %(col3)s, %(col4)s)
ON CONFLICT (id) DO
UPDATE SET col2 = CASE
WHEN tablename.col1 = %(col1)s
THEN tablename.col2 + 1
ELSE tablename.col2
END;
'''
result = cur.execute(query, data)
同样,您可以使用 excluded
别名:
...
CASE
WHEN tablename.col1 = excluded.col1
THEN tablename.col2 + 1
ELSE tablename.col2
END;