如何在冲突时使用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做的更新并不好,因为如果它将是重复键,它将合并它们,然后参数的数量将不等于值的数量。
答案 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。