psycopg2.InternalError: ALTER SYSTEM cannot run inside a transaction block

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章