Mysql Postgresq/Python,将更新和插入查询转换为一个查询,该查询仅在记录不存在时插入';不存在
我正在使用以下两个查询(在PostgreSQL/Python中): 与这两个查询不同,我只希望有一个查询在记录不存在时自动插入记录。我有两个问题:Mysql Postgresq/Python,将更新和插入查询转换为一个查询,该查询仅在记录不存在时插入';不存在,mysql,postgresql,Mysql,Postgresql,我正在使用以下两个查询(在PostgreSQL/Python中): 与这两个查询不同,我只希望有一个查询在记录不存在时自动插入记录。我有两个问题: 如何使用PostgreSQL将这两个查询合并为一个查询?(重要) 如何使用MySQL实现同样的功能?(可选) 有一种叫做merge语句的东西。这正是你想要的 不需要查询更新 向您的查询添加关于冲突的子句\u插入变量 query_insert = """INSERT INTO my_table ({}) VALUE
有一种叫做merge语句的东西。这正是你想要的 不需要查询更新 向您的查询添加关于冲突的子句\u插入变量
query_insert = """INSERT INTO my_table ({})
VALUES ('{}')
ON CONFLICT ({}) DO
UPDATE
SET {}""".format(*[str(columns_to_insert), str(column_values), str(key_columns)], str(column_values_update))
这里,,
列\u to \u insert应该是以逗号分隔的列列表,这些列是插入数据的列;
列\u值应为列\u至\u插入值的逗号分隔列表;
key_列应该是以逗号分隔的主键列列表;
column\u values\u update应该是以逗号分隔的column\u name=column\u value对列表(类似于常规的update命令)。您知道如何将上述代码转换为merge语句吗?我的理解是merge存在并发性问题,这意味着您通常希望在使用它时锁定表,这对于更新单行来说是次优的。此外,merge主要用于在一条语句中更新多行。出于OP的目的,upsert(关于冲突)更合适。仅供参考,我看到了这一点,但我无法使用我的示例使其工作。谢谢!有一个问题,因为我有一个熊猫数据框,我是否将
df.columns
而不是
?@user8436761抱歉,我不知道df.columns是什么。。。相反,您应该键入my_表主键列的逗号分隔列表。这将是一个名为“index”的列,但当我将其放入时,我收到一个错误:SET{}='{}'”。格式(*[str(更新的_列)、str(更新的_值)、str(更新的_行_索引)])索引器:元组索引超出范围
。有什么想法吗?@user8436761好的,我已经编辑了答案并添加了一些解释。注意:我已经更改了变量的名称并添加了一些新变量。{}成对数必须等于您在数组中为format函数传递的项数。希望这能有所帮助。我尝试了多个版本,但仍然得到相同的元组索引超出范围错误或错误:多列更新项的源必须是子选择项或行()expression
错误。您是否有一些列名和实数的示例?查询是什么样子的?
query_insert = """INSERT INTO my_table ({})
VALUES ('{}')
ON CONFLICT ({}) DO
UPDATE
SET {}""".format(*[str(columns_to_insert), str(column_values), str(key_columns)], str(column_values_update))