插入时与查询参数冲突



如何在冲突时使用psycopg2查询参数?例如,我有这样的数据:

#This is the data for the insert query
q_values = {'customer_app_id': '35', 'email': 'my@email.com', 'access_counter': 1, 'company_name': 'twitter', 'status': 'start'}
#This is the data for the on conflict query part
conflict_values = {'access_counter': +1, 'status': 'check', 'status_info': 'already exist'}

这是一个查询:

insert into access (customer_app_id,email,access_counter,company_name,status) 
values (%s,%s,%s,%s,%s) ON CONFLICT (customer_app_id,email)  DO UPDATE SET 
%s,%s,%s RETURNING *

然后我运行这条线路:

q_values = q_values.update(conflict_values)
cursor.execute(query, q_values)

首先,如何在与查询参数发生冲突时运行?

其次,我对dict进行的更新并不好,因为如果它是重复的键,它会合并它们,然后参数的数量将等于值的数量。

  • 和access_counter+1-在冲突中,我试图将access_counter增加1

你能帮忙吗?非常感谢。

要在与查询参数发生冲突时运行:%s必须替换为%(您要访问的键值)。既然你在用字典,就必须这样做。因此,在这种情况下,查询将如下所示-

插入访问(customer_app_id、电子邮件、access_counter、company_name、status)值(%(customer_app_id)s、%(电子邮件)s、百分比(access_counter)s、%s(company_name)s和%(状态)s)处于冲突

要更新访问计数器:不需要使用单独的词典。相反,ON CONFLICT您可以直接在数据库中进行更改。因此,在这种情况下,最终查询将如下所示-

插入访问(customer_app_id、电子邮件、access_counter、company_name、status)值(%(customer_app_id)s、%(电子邮件)s、百分比(access_counter)s、%s(company_name)s和%(状态)s)冲突(customer_app.id,电子邮件)DO UPDATE SET access_counter=access.access_counter+1

如果要将其中一个列值更新为INSERT查询中发送的新值,则必须使用EXCLUDED关键字。

示例(此示例与问题无关)

插入用户详细信息(user_id、用户名、电子邮件、last_login)值(%s、%s、%s和%s)冲突时(user_id)执行更新设置last_login=排除。last_login

当您传递值的字典(而不是列表或元组)时,我认为您需要使用%(name)s占位符,而不是%s

这意味着您可以为占位符提供其他名称,这样它们在q_values字典中就不会发生冲突。

有关详细信息,请参阅文档。

最新更新