插入与查询参数冲突

时间:2017-03-01 01:00:18

标签: python postgresql psycopg2 postgresql-9.5

如何在冲突时使用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 - 关于冲突我试图通过1增加访问_counter
你能帮帮忙吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

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

插入访问权限(customer_app_id,电子邮件,access_counter,公司名称,状态) 值(%(customer_app_id)s,%(email)s,%(access_counter)s,%(company_name)s,%(status)s)发生冲突

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

插入访问权限(customer_app_id,电子邮件,access_counter,公司名称,状态) 值(%(customer_app_id)s,%(email)s,%(access_counter)s,%(company_name)s,%(stats)s)ON CONFLICT(customer_app_id,email)做更新设置access_counter = access.access_counter + 1 < / strong>

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

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

将INERT插入到user_details(user_id,用户名,电子邮件,last_login) 值(%s,%s,%s,%s) 在冲突(user_id)上进行更新 SET last_login = EXCLUDED.last_login

答案 1 :(得分:0)

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

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

有关详细信息,请参阅documentation