如果记录存在,我必须编写一个查询来更新记录,否则插入它。我正在将此更新/插入到 postgres 数据库中。我查看了 upsert 示例,其中大多数使用最多两个字段进行更新。但是,我想更新多列。示例:
query="""INSERT INTO table (col1,col2,col3,col4,col5,col6,col7,col8,col9,..col20) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
ON CONFLICT(col2) DO UPDATE SET (col1,col2,col3,col4,col5,col6,col7,col8,col9,..col20) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
在上面的查询中,假设 col2 是唯一键,我将插入和更新相同数量的列。我必须使用 pymysql(python 库)执行此查询。在一个简单的插入语句中,我知道如何动态传递包含参数的元组。
cursor.execute(insert_query, data_tuple)
但在这种情况下,我有两个位置(插入和更新)输入都是动态的。考虑到上面的 upsert 查询,我将参数传递给游标的方式
cursor.execute(upsert_query,data_tuple,data_tuple)
但是,这个函数会抛出一个错误,其中包含执行函数中的参数数量。那我怎么过?此外,我正在尝试使用这种方式来传递参数,因为使用赋值(=)对于 20 列来说是一件费力的事情。
还有其他替代方法吗?就像 mysql 中一个简单的“替换成”语句。
最佳答案
您问题的直接答案是,您执行 tuple + tuple
来加倍元组。
cursor.execute(upsert_query, data_tuple + data_tuple)
其他选项:
如果您有单独的值并且正在构造元组,则可以直接构造一个具有两倍数量的值的元组。
query="""INSERT INTO table (col1,col2,col3,col4,col5,col6,col7,col8,col9,..col20) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
ON CONFLICT(col2) DO UPDATE SET col1=%s, col3=%s, col4=%s, ..."""
cur.execute(query, (c1, c2, c3, ... c20, c1, c3, c4, ... c20))
您必须指定两次值(col2 除外)。
如果您已经有了您最初要求的元组,那么您将使用 +
将同一个元组合并两次。
如果你有单独的值而不是元组,你也可以使用像字典这样的命名参数。
query="""INSERT INTO table (col1,col2,col3,col4...) VALUES(%(c1)s, %(c2)s, %(c3)s, %(c4)s...) ON CONFLICT(col2) DO UPDATE SET col1=%(c1)s, col3=%(c3)s, col4=%(c4)s, ..."""
cur.execute(query, {'c1': c1val, 'c2': c2val, 'c3': c3val, 'c4': c4val, ...})
这种形式可读性好,只传递一次参数,如果以后列数发生变化,也便于维护(增加列等)。
关于postgresql - 更新冲突 postgres 上的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55922003/