Mysql Postgresq/Python,将更新和插入查询转换为一个查询,该查询仅在记录不存在时插入';不存在

Mysql Postgresq/Python,将更新和插入查询转换为一个查询,该查询仅在记录不存在时插入';不存在,mysql,postgresql,Mysql,Postgresql,我正在使用以下两个查询(在PostgreSQL/Python中): 与这两个查询不同,我只希望有一个查询在记录不存在时自动插入记录。我有两个问题: 如何使用PostgreSQL将这两个查询合并为一个查询?(重要) 如何使用MySQL实现同样的功能?(可选) 有一种叫做merge语句的东西。这正是你想要的 不需要查询更新 向您的查询添加关于冲突的子句\u插入变量 query_insert = """INSERT INTO my_table ({}) VALUE

我正在使用以下两个查询(在PostgreSQL/Python中):

与这两个查询不同,我只希望有一个查询在记录不存在时自动插入记录。我有两个问题:

  • 如何使用PostgreSQL将这两个查询合并为一个查询?(重要)
  • 如何使用MySQL实现同样的功能?(可选)

  • 有一种叫做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))