【发布时间】:2010-11-04 06:51:09
【问题描述】:
我正在将 Python 与 psycopg2 一起使用,并且我正在尝试在插入数千行的日常操作之后运行完整的 VACUUM。问题是当我尝试在我的代码中运行VACUUM 命令时,出现以下错误:
psycopg2.InternalError: VACUUM cannot run inside a transaction 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)
【问题讨论】:
-
@nosklo,好建议,但根据 Postgres 文档,这与 COMMIT 相同。
-
您是否在使用 SQLAlchemy?我遇到了类似的问题,因为在 SqlAlchemy 中设置 autocommit=True 并没有实际上关闭事务。使用
set_isolation_level是一种访问 psycopg2 连接的内部方法的变通方法。 -
@MichaelAquilina 我相信当时(现在是 6 年前)这是一个不使用 ORM 的项目的一部分。
标签: python sql postgresql psycopg2 vacuum