postgresql - 更新冲突 postgres 上的多个列

标签 postgresql sql-insert pymysql upsert on-duplicate-key

如果记录存在,我必须编写一个查询来更新记录,否则插入它。我正在将此更新/插入到 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/

相关文章:

json - 在 PostgreSQL 中从 JSON 数组创建 XML

sql - 针对大量列进行 Un-Pivoting Postgres

mysql - 在 mysql View 中插入给出错误的输出

sqlite - SQLite 中的 "Insert if not exists"语句

java - 如何在 jdbc 的语句中使用 DECLARE 子句?

Python:为与 mysql 的拒绝数据库连接创建异常

python - 使用 PYMYSQL 更正 Python 中的 SQL 用法

bash - 在 Windows 上加速大量短暂的 `psql` session

sql - 消除具有反转值的列的行

Python 序列 id 到 mysql 与文本