3

我有一個PostgreSQL 9.1服務器這樣一個表:如何防止psycopg2鎖定表

CREATE TABLE foo(id integer PRIMARY KEY); 

與psycopg2(≥2.4.2)的交互式Python外殼,我可能會啓動連接和光標和查詢該表:

import psycopg2 
conn = psycopg2.connect('dbname=...') 
curs = conn.cursor() 
curs.execute('SELECT * FROM foo;') 
curs.fetchall() 

但是,如果我再嘗試修改表:

ALTER TABLE foo ADD COLUMN bar integer; 

這個啓動虛擬deadl直到我從Python執行conn.close()

我該如何開始與psycopg2的簡單連接,以防止DDL在其他地方造成死鎖? Python中的連接可以是隻讀的。

回答

2

我找到的解決方案是使用set_session這樣的:

conn.set_session(readonly=True, autocommit=True) 

autocommit的文件警告說:

默認情況下,任何查詢執行,其中包括一個簡單的SELECT將啓動一個事務:對於長時間運行的程序,如果不採取進一步行動,會話將保持「閒置在事務中」,這是由於多種原因(會話鎖定,表膨脹......)的不良狀況。對於長期存在的腳本,請確保儘快終止事務或使用自動提交連接。

這總結了一個簡單的SELECT在問題中的經驗。

+1

你也可以只是'conn.commit()'而不是'autocommit'設置爲'True' –