gpt4 book ai didi

python - PostgreSQL - 如何从事务 block 外的代码运行 VACUUM?

转载 作者:IT老高 更新时间:2023-10-28 21:57:14 43 4
gpt4 key购买 nike

我正在将 Python 与 psycopg2 一起使用,并且我正在尝试在插入数千行的日常操作之后运行完整的 VACUUM。问题是当我尝试在我的代码中运行 VACUUM 命令时,出现以下错误:

psycopg2.InternalError: VACUUM cannot run inside a transaction block

如何从事务 block 外部的代码运行它?

如果有什么不同,我有一个简单的 DB 抽象类,它的子集显示在下面的上下文中(不可运行,省略异常处理和文档字符串,并进行了跨行调整):

class db(object):
def __init__(dbname, host, port, user, password):
self.conn = psycopg2.connect("dbname=%s host=%s port=%s \
user=%s password=%s" \
% (dbname, host, port, user, password))

self.cursor = self.conn.cursor()

def _doQuery(self, query):
self.cursor.execute(query)
self.conn.commit()

def vacuum(self):
query = "VACUUM FULL"
self._doQuery(query)

最佳答案

经过更多搜索,我发现了 psycopg2 连接对象的isolation_level 属性。事实证明,将其更改为 0 会将您移出事务 block 。将上述类的vacuum方法改成如下即可解决。请注意,我还将隔离级别设置回以前的状态以防万一(默认情况下似乎是 1)。

def vacuum(self):
old_isolation_level = self.conn.isolation_level
self.conn.set_isolation_level(0)
query = "VACUUM FULL"
self._doQuery(query)
self.conn.set_isolation_level(old_isolation_level)

This article (接近该页的末尾)提供了在此上下文中隔离级别的简要说明。

关于python - PostgreSQL - 如何从事务 block 外的代码运行 VACUUM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1017463/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com