2010-10-14 17 views
6

Vâng, câu hỏi khá nhiều tóm tắt nó. Hoạt động db của tôi rất cập nhật, và tôi muốn lập trình một Phân tích chân không. Tuy nhiên tôi nhận được một lỗi nói rằng truy vấn không thể được thực hiện trong một giao dịch. Có cách nào khác để làm điều đó không?Có thể phát hành "VACUUM ANALYZE <tablename>" từ psycopg2 hoặc sqlalchemy cho PostgreSQL không?

+0

thể trùng lặp của (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –

+0

Cảm ơn, nó là một bản sao. Làm thế nào tôi có thể đánh dấu nó là một? – donatello

Trả lời

9

Đây là một lỗ hổng trong API DB-Python: nó bắt đầu một giao dịch cho bạn. Nó không nên làm điều đó; cho dù và khi nào bắt đầu một giao dịch phải được lập trình viên. API cấp thấp, lõi như thế này không nên giữ nhà phát triển và làm những việc như bắt đầu giao dịch sau lưng chúng tôi. Chúng tôi là con trai lớn - chúng tôi có thể bắt đầu giao dịch ourself, cảm ơn.

Với psycopg2, bạn có thể tắt hành vi không may này với tiện ích mở rộng API: gọi connection.autocommit(). Không có API chuẩn nào cho điều này, thật không may, vì vậy bạn phải phụ thuộc vào các phần mở rộng không chuẩn để phát hành các lệnh phải được thực hiện bên ngoài giao dịch.

Không có ngôn ngữ nào không có mụn cóc và đây là một trong những ngôn ngữ của Python. Tôi đã bị cắn bởi điều này trước đây.

+0

chỉ là một nhận xét rằng 'connection.autocommit' là một thuộc tính boolean, không phải là một hàm. Vì vậy, để thực hiện các truy vấn bên ngoài một giao dịch, bạn có thể đặt 'connection.autocommit = True' trước khi thực thi VACUUM –

3

Bạn có thể bật Postgres autocommit chế độ sử dụng SQLAlchemy của raw_connection (mà sẽ cung cấp cho bạn một "thô" Kết nối psycopg2): [? PostgreSQL - làm thế nào để chạy chân không từ mã khối giao dịch bên ngoài]

import sqlalchemy 
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT 


engine = sqlalchemy.create_engine(url) 
connection = engine.raw_connection() 
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) 
cursor = connection.cursor() 
cursor.execute("VACUUM ANALYSE table_name") 
Các vấn đề liên quan