Tôi đang sử dụng Python với psycopg2 và tôi đang cố gắng chạy toàn bộ VACUUM
sau một thao tác hàng ngày chèn hàng nghìn hàng. Vấn đề là khi tôi cố gắng chạy lệnh VACUUM
trong mã của tôi, tôi nhận được lỗi sau:PostgreSQL - cách chạy VACUUM từ mã bên ngoài khối giao dịch?
psycopg2.InternalError: VACUUM cannot run inside a transaction block
Làm thế nào để chạy này từ mã bên ngoài một khối giao dịch?
Nếu nó làm cho một sự khác biệt, tôi có một lớp trừu tượng DB đơn giản, một tập hợp con trong số đó sẽ được hiển thị dưới đây để biết ngữ cảnh (không Runnable, xử lý ngoại lệ và docstrings bỏ qua và đường kéo dài điều chỉnh thực hiện):
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)
thử gửi GIAO DỊCH END? – nosklo
@nosklo, Đề xuất tốt, nhưng theo tài liệu Postgres giống với COMMIT. –
Bạn có đang sử dụng SQLAlchemy không? Tôi đã gặp một vấn đề tương tự vì thiết lập autocommit = True trong SqlAlchemy không * thực sự * tắt giao dịch. Sử dụng 'set_isolation_level' là một công việc xung quanh truy cập các phương thức nội bộ của kết nối psycopg2. –