在服務器上,我有一個由一個或多個客戶端呼叫的 API。服務器幾乎可以同時接收同一 PostgreSQL 屬性的多個更新指令。這些請求不會在完全相同的時間到達,我只想一個接一個地執行它們。由于(Flask)API,我無法控制上一次呼叫結束,因此可以在上一次呼叫完成之前呼叫新的更新。除了 psycopg2/postgresql 之外,我希望能夠將更新排入佇列并一個接一個地悄悄地進行(甚至可能不是按順序進行),但它似乎不是這樣作業的。
以下是需要更新時在服務器上呼叫的函式的簡化版本。要更新的屬性是一個 JSONB 物件,如果這很重要的話。因此,有“路徑”來確定要更新 JSONB 物件的哪一部分。因此 API 呼叫如下所示:
def pg_update(data, path):
conn = psycopg2.connect(...) # always the same database.
cur = conn.cursor()
# JSONB update for a single selected row and column.
# 'column' and 'select_row' are determined with the parameters 'data' and 'path'.
command = (
f"""UPDATE MY_TABLE SET """
f"""{column} = jsonb_merge({column}, %s) """
f"""WHERE {select_row};"""
)
cur.execute(command, [Json(data)])
conn.commit()
當連續呼叫兩次時,此呼叫會導致錯誤(在“cur.execute”處):
psycopg2.errors.InternalError_: tuple concurrently updated
由于服務器一直在運行,我還可以conn在 API 呼叫“pg_update”之外定義,以便使用相同的 psycopg2 連接處理所有呼叫。但是,當為同一屬性請求兩次更新時,我得到:
psycopg2.ProgrammingError: execute cannot be used while an asynchronous query is underway
我強行async_ = False進去psycopg2.connect,以防萬一。沒變化。
總而言之,即使從獨立的、無法控制的客戶端請求幾乎同時請求這些更新,我怎樣才能允許對相同屬性的多次更新,一個接一個?也許需要一個鎖定機制?排隊機制?
uj5u.com熱心網友回復:
您可以使用SELECT FOR UPDATE機制。這里有一些簡單的例子,可能會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388201.html
標籤:Python PostgreSQL的 psycopg2
上一篇:使用entityManager本機查詢運行時,WITH遞回查詢不起作用
下一篇:計算每種型別的禮物發送了多少
