postgresql Azure Functions自动递增ID时出现Postgres ID违规错误

mccptt67  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(110)

我有一个Azure函数,可以从API中检索数据并将其保存到Postgres DB。现在我有这个返回错误与重复的ID
数据库操作时出错:重复键值违反唯一约束“contacts_pkey”。Key(id)=(12736022)已存在。
下面是函数中的insert语句

def process_contacts(dbString, data, db_table_contacts):
    sql_contacts = f"""INSERT INTO {db_table_contacts}(uuid, name, age, gender, .....)
          VALUES (%s, %s, %s, %s, %s, .....)
          ON CONFLICT (uuid) DO UPDATE SET

我在处理每笔交易250份的记录。这也是我在Postgres中的约束

我在这里错过了什么,记录是自动cimeneting的ID,并应更新时,有重复设置?

2skhul33

2skhul331#

以下是我的步骤:

  • 定义了一个函数process_contacts。它包含三个参数dbStringdataBnewcontacts
    *dbString用于确定与PostgreSQL数据库的连接。data用于存储数据库中存在的数据。
  • 使用uuid.uuid4()为每个联系人生成新的UUID。
  • sql_contacts由SQL语句组成,其中包含ON CONFLICT子句的CONFLICT语句。
  • 通过使用ON CONFLICT,如果表中已经存在具有相同id的记录,则将使用新值更新该记录。我在下面的代码中尝试了同样的方法。在您的代码中,您试图插入已经存在于数据库中的id,但ON CONFLICT用于uuid。我尝试了相同的,它给出了相同的错误,你在上面显示。
def process_contacts(dbString, data, BnewContacts):
    try:
        conn = psycopg2.connect(dbString)
        cur = conn.cursor()

        for record in data:
            id_val, name, age, gender = record
            
            uuid_value = uuid.uuid4()
            
            uuid_str = str(uuid_value)
            
            sql_contacts = """INSERT INTO BnewContacts(id, uuid, name, age, gender)
                              VALUES (%s, %s, %s, %s, %s)
                              ON CONFLICT (id) DO UPDATE SET
                              uuid = EXCLUDED.uuid,
                              name = EXCLUDED.name,
                              age = EXCLUDED.age,
                              gender = EXCLUDED.gender
                           """
            cur.execute(sql_contacts, (id_val, uuid_str, name, age, gender))  # Exclude the id column

        
        conn.commit()
        conn.close()
        print("Data successfully inserted or updated.")
    except Exception as e:
        
        print(f"Error: {e}")
        
data = [
    (1, 'Sai', 24, 'Male'),
    (2, 'Venkatesh', 18, 'Male')
    ]
dbString = "dbname=citus user=**** password=**** host=****"
db_table_contacts = "BnewContacts"

process_contacts(dbString, data, db_table_contacts)

输出:

Data successfully inserted or updated.
id |                 uuid                 |   name    | age | gender 
----+--------------------------------------+-----------+-----+--------
  1 | f8c694f2-2fd4-420b-8fac-483b6d4f3c13 | Sai       |  14 | Male
  2 | 00e3078a-13df-4ff8-865c-4fcac5ff9f26 | Venkatesh |  28 | Male
(2 rows)

citus=> SELECT * FROM BnewContacts;
 id |                 uuid                 |   name    | age | gender 
----+--------------------------------------+-----------+-----+--------
  1 | 5fec84e0-b9da-4ed1-a9f7-ceb156bc0ccb | Sai       |  24 | Male
  2 | 576f0a6a-82bf-401d-b1ad-38fcd5a3987f | Venkatesh |  18 | Male
  • 使用ON CONFLICT我试图插入数据库中已经存在的数据.年龄值已在上述输出中更新。
  • 有关关于冲突的更多信息,请参阅此link

相关问题