簡體   English   中英

與查詢參數沖突時插入

[英]Insert on conflict with query parameters

我如何在沖突中使用 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 替換為 %(您要訪問的鍵值)s。 由於您使用的是字典,因此必須這樣做。 因此,在這種情況下,查詢將如下所示 -

插入訪問 (customer_app_id,email,access_counter,company_name,status) 值 (%(customer_app_id)s,%(email)s,%(access_counter)s,%(company_name)s,%(status)s) ON CONFLICT

更新訪問計數器: 不需要使用單獨的字典。 ON CONFLICT您可以直接在數據庫中進行更改。 因此,在這種情況下,最終查詢將如下所示 -

插入訪問 (customer_app_id,email,access_counter,company_name,status) 值 (%(customer_app_id)s,%(email)s,%(access_counter)s,%(company_name)s,%(status)s) ON CONFLICT (customer_app_id) ,email) DO UPDATE SET access_counter = access.access_counter + 1

如果要將列值之一更新為在INSERT查詢中發送的新值,則必須使用 EXCLUDED 關鍵字。

示例(此示例與問題無關)

INSERT INTO user_details (user_id, username,email,last_login) VALUES (%s, %s, %s,%s) ON CONFLICT (user_id) DO UPDATE SET last_login = EXCLUDED.last_login

當您傳遞值字典(而不是列表或元組)時,我認為您需要使用%(name)s占位符,而不是%s

這意味着您可以為占位符提供替代名稱,因此它們不會在q_values字典中發生沖突。

有關詳細信息,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM