【问题标题】:How to build a generic function in Python to Insert and update records?如何在 Python 中构建通用函数来插入和更新记录?
【发布时间】:2022-12-12 10:24:19
【问题描述】:

我想在 Python 中构建一个通用函数,如果记录在表 A 中不存在,则从表 A 中插入一条记录到表 A 中,否则如果主键被识别,则更新数据。我无法使用以下代码获得结果:

def insert_update_record(table_A, table_B):
    insert_query = "INSERT INTO {} SELECT * FROM {} WHERE NOT EXISTS (SELECT 1 FROM {} WHERE {}.id = {}.id)".format(table_A, table_B, table_A, table_B, table_A)
    update_query = "UPDATE {} SET {} = {} FROM {} WHERE {}.id = {}.id".format(table_A, table_A, table_B, table_A, table_B, table_A)
    
    cur.execute(insert_query)
    cur.execute(update_query)
    conn.commit()

【问题讨论】:

  • 您使用的数据库是什么?
  • @Javad postgres
  • 你得到什么错误/结果?

标签: python sql python-3.x database dbconnection


【解决方案1】:

首先,我应该说你的 insert_query 中的 SELECT 1 不正常,你可能需要将其更改为这样的内容:

insert_query = "INSERT INTO {} SELECT * FROM {} WHERE NOT EXISTS (SELECT * FROM {} WHERE {}.id = {}.id) LIMIT 1".format(table_A, table_B, table_A, table_B, table_A)

但是你想要实现的是一个叫做Upsert在数据库概念中,我使用 INSERT ON CONFLICT 语句为您完成,如下所示:

import psycopg2


def connect():
    try:
        conn = psycopg2.connect(database ="name_of_your_database",
                            user = "user_of_this_database",
                            password = "password_forthis_user",
                            host = "localhost",
                            port = "5432")

        cur = conn.cursor()
    
    except (Exception, psycopg2.DatabaseError) as error:
        print ("Error while creating PostgreSQL table", error)
    
    return conn, cur

def insert_update_record(table_A, table_B):
    conn, cur = connect()
    upsert_query="""
INSERT INTO {}
SELECT * FROM {} LIMIT 1
ON CONFLICT (id) 
DO 
   UPDATE SET field_name = EXCLUDED.field_name || ';' || {}.field_name;
""".format(table_A, table_B, table_B)

    cur.execute(upsert_query)
    conn.commit()

if __name__ == '__main__':
    insert_update_record("table_name_1", "table_name_2")

参考:

要了解有关此概念的更多信息,请访问Postgres或其他数据库,您可以访问以下链接:

Psycopg2: how to insert and update on conflict using psycopg2 with python? [stackoverflow]

Insert, on duplicate update in PostgreSQL? [stackoverflow]

PostgreSQL Upsert Using INSERT ON CONFLICT statement [POSTGRESQL TUTORIAL]

How to UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL? [stackoverflow]

Idiomatic way to implement UPSERT in PostgreSQL [dba-stackexchange]

【讨论】:

    【解决方案2】:

    Python 使用 c.execute(q) 函数更新表中的记录,其中 c 是游标,q 是要执行的更新查询。

    句法:

    # execute SQL query using execute() method.
    cursor.execute(sql)
    cursor.commit()
    # get the record count updated
    print(mycursor.rowcount, "record (s) affected")
    

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 2013-02-06
      • 2021-10-16
      • 2020-06-02
      • 2013-07-04
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多