psycopg2.InternalError: ALTER SYSTEM cannot run inside a transaction block
在用python寫Postgresql的一個腳本的時候,出現瞭如題目所示的問題,從錯誤提示的字面意思看是因爲 ALTER SYSTEM無法運行在事務塊中,查了一些資料後大概明白是什麼問題導致的,因爲版本的原因導致psycopy2不支持execute() 執行帶有alter等關鍵字的sql執行語句,需要對代碼做一下小小的修改就可以了
原來的代碼如下:
# 這裏只展示部分代碼
def Execute(self, sql, params=None):
self.error = ""
try:
if params:
if not isinstance(params, tuple) and not isinstance(params, list) and not isinstance(params, dict):
params = (params,)
# 就是執行下面這行代碼的時候報錯的
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
self.conn.commit()
except Exception, e:
try:
self.conn.rollback()
except:
pass
self.error = str(e)
return False
return True
現在要怎麼做呢?
需要在執行 self.cursor.execute(sql)的時候 將事物移除出去 執行完成後 再恢復爲原來的事物
代碼如下:
def Execute2(self, sql, params=None):
self.error = ""
try:
if params:
if not isinstance(params, tuple) and not isinstance(params, list) and not isinstance(params, dict):
params = (params,)
# 記錄原來的事務標誌,並移除 設置爲0代表移除事物
old_isolation_level = self.conn.isolation_level
self.conn.set_isolation_level(0)
self.cursor.execute(sql, params)
# 執行完之後 再恢復原來的事務
self.conn.set_isolation_level(old_isolation_level)
else:
old_isolation_level = self.conn.isolation_level
self.conn.set_isolation_level(0)
self.cursor.execute(sql)
self.conn.set_isolation_level(old_isolation_level)
self.conn.commit()
except Exception, e:
try:
self.conn.rollback()
except:
pass
self.error = str(e)
return False
return True
這樣子 就可以了
參考鏈接
https://oomake.com/question/178511