我正在執行以下代碼,
import psycopg2
import pandas as pd
@contextmanager
def get_psyopg2_connection(server='my_server', port=1234, read_only=True):
try:
conn = psycopg2.connect("<connection_string>")
conn.set_session(readonly=read_only, autocommit=True)
yield conn
except Exception as e:
raise Exception(e) from e
finally:
conn.close()
if __name__=="__main__":
with get_psyopg2_connection() as conn_dev:
df = pd.read_sql("""select last_value from public.lime_boxes_id_seq""", conn_dev)
print(df)
我收到兩個不同的結果;last_value = 6(正確)和 33(錯誤)。當我多次運行相同的代碼時,我可能會得到像 6、6、6、33、33、6 這樣的結果序列。這是不可預測的。
當我在 DBeaver 中執行這個查詢時,我總是得到 6。
這怎么可能發生?
編輯:
該表是一個序列,除了我自己,沒有人訪問此模式。這里是內容
| 最后一個值 | log_cnt | 叫做 |
|---|---|---|
| 6 | 27 | 真的 |
uj5u.com熱心網友回復:
有 3 種不同的可能性對我來說很突出:
中有多條記錄
public.lime_boxes_id_seq,由于沒有指定ORDER BY子句,所以資料庫不保證記錄回傳的順序。雖然這絕對是一個低可能性,但仍然值得探索被查詢的表實際包含哪些資料并從那里開始作業。有問題的資料庫服務器(
my_server)實際上是某種負載平衡器的它后面的Postgres節點的集群,并且存在下降,其余同步進行,并回傳舊的/不正確的資料的一個或多個節點。這將完全解釋您的 DBeaver 客戶端每次獲得相同結果的原因(它可能不是在查詢之間連接/斷開/重新連接,可能每次都連接到不同的服務器,并且可能在查詢之間保持相同的連接),但是您的代碼(連接/斷開/重新連接每次執行)不會。為了緩解這種情況,您可以連接到集群中已知良好的節點(如果您的網路設定允許這樣的安排),或者修復導致資料過時的復制問題。如果所討論的值曾經是 33,那么在您的代碼和 Postgres 中回傳此錯誤資料的表之間的網路中可能存在某種快取機制。如果它被此設備/這些設備快取并且此后未重繪 ,這也可能是此資料未回傳您認為應該回傳的內容的原因,并且快取重繪 /重新配置是必要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408971.html
標籤:
