2010-03-30 31 views
6

Làm việc với con trỏ trong mysql-python Tôi thường gọi "BEGIN;", "COMMIT;" và "ROLLBACK;" một cách rõ ràng như sau:Tại sao kết nối trong DB-API của Python không có hoạt động "bắt đầu"?

try: 
    cursor.execute("BEGIN;") 
    # some statements 
    cursor.execute("COMMIT;") 
except: 
    cursor.execute("ROLLBACK;") 

sau đó, tôi phát hiện ra rằng đối tượng kết nối cơ bản có những phương pháp tương ứng:

try: 
    cursor.connection.begin() 
    # some statements 
    cursor.connection.commit() 
except: 
    cursor.connection.rollback() 

Kiểm tra DB-API PEP tôi phát hiện ra rằng nó không đề cập đến phương pháp bắt đầu() cho đối tượng kết nối, ngay cả đối với các phần mở rộng.

Mysql-python, bằng cách này, ném DeprecationWarning, khi bạn sử dụng phương pháp. sqlite3.connection, ví dụ, không có phương pháp nào cả.

Và câu hỏi đặt ra là tại sao không có phương pháp như vậy trong PEP? Câu lệnh này có phải là tùy chọn không, có đủ để gọi commit() không?

Trả lời

3

Quyết định để trả lời bản thân mình:

Một thread about DB API 2.0 transactions trong python-list và các đoạn trích sau đây từ cuốn sách đáng chú ý SQL The Complete Reference làm cho tôi nghĩ rằng DB API thực hiện SQL1 hành vi tiêu chuẩn:

Phiên bản đầu tiên của SQL tiêu chuẩn (SQL1) đã xác định một giao dịch ngầm định chế độ, dựa trên giao dịch hỗ trợ trong bản phát hành đầu của DB2. Ở chế độ ngầm, chỉ hỗ trợ các câu lệnh COMMIT và ROLLBACK. Một giao dịch SQL SQL tự động bắt đầu với câu lệnh SQL đầu tiên được thực thi bởi người dùng hoặc chương trình và kết thúc khi COMMIT hoặc ROLLBACK được thực thi. kết thúc một giao dịch hoàn toàn bắt đầu một giao dịch mới.

Chế độ giao dịch rõ ràng (SQL2 và SQL: 1999) có vẻ thuận tiện khi RDBSM hỗ trợ chế độ tự động và kết nối hiện tại ở chế độ đó, nhưng DB API không phản ánh.

7

xem a this previously asked question. Nói chung, "giao thức" để sử dụng với các giao dịch là:

cursor = conn.cursor() 
try: 
    cursor.execute(...) 
except DatabaseError: 
    conn.rollback() 
    raise 
else: 
    conn.commit() 
finally: 
    cursor.close() 

Bắt đầu từ python 2.6 sqlite Connection objects can be used as context managers that automatically commit or rollback transactions.

+0

Cảm ơn bạn đã liên kết hữu ích cho câu hỏi lân cận. Đây không phải là câu trả lời cho câu hỏi của tôi nhưng nó làm sáng tỏ một số lý do có thể. – newtover

+0

@newtower: Bạn nói đúng, tôi đã nghi ngờ trả lời hoặc chỉ đăng một bình luận nhưng làm như vậy tôi có thể đăng bài nhỏ đó. –

+0

Bằng cách này, mặc dù gói kết nối với một trình quản lý ngữ cảnh là hữu ích, tôi thích sử dụng lại kết nối trong các truy vấn liền kề, nhưng các lớp con trỏ không thực hiện giao diện contextmanager, ngay cả trong trăn 2.6. – newtover

Các vấn đề liên quan