首先,我应该说你的 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]