2010-02-24 18 views
27

Đây là kịch bản. Trong hàm của bạn, bạn đang thực hiện các câu lệnh bằng cách sử dụng một con trỏ, nhưng một trong số chúng không thành công và một ngoại lệ được ném ra. Chương trình của bạn thoát khỏi chức năng trước khi đóng con trỏ mà nó đang làm việc. Con trỏ có nổi xung quanh chiếm không gian không? Tôi có phải đóng con trỏ không?Trong Python với sqlite là cần thiết để đóng một con trỏ?

Ngoài ra, tài liệu Python có ví dụ về sử dụng con trỏ và nói: "Chúng tôi cũng có thể đóng con trỏ nếu chúng tôi đã thực hiện xong." Từ khóa là "có thể", không phải "phải". Chúng có ý nghĩa gì bởi điều này?

Trả lời

7

Bạn không bắt buộc phải gọi số close() trên con trỏ; nó có thể là rác được thu thập như bất kỳ đối tượng nào khác. Nhưng ngay cả khi chờ đợi cho bộ sưu tập rác có vẻ OK, tôi nghĩ rằng nó sẽ là phong cách tốt vẫn để đảm bảo rằng một nguồn tài nguyên như một con trỏ cơ sở dữ liệu được đóng cửa có hay không có một ngoại lệ.

15

Đây có thể là một ý tưởng hay (mặc dù nó có thể không quan trọng lắm với sqlite, không biết ở đó, nhưng nó sẽ làm cho mã của bạn dễ dàng hơn). Hơn nữa, với Python gần đây (2.5+), thật dễ dàng:

from __future__ import with_statement 
from contextlib import closing 

with closing(db.cursor()) as cursor: 
    # do some stuff 
5

Tôi chưa thấy bất kỳ ảnh hưởng nào cho hoạt động sqlite3.Cursor.close().

Sau khi đóng, bạn vẫn có thể gọi fetch(all|one|many) sẽ trả lại kết quả còn lại từ câu lệnh thực hiện trước đó. Thậm chí chạy Cursor.execute() vẫn hoạt động ...

+1

Tôi nhận thấy hành vi tương tự (tôi đã có bài kiểm tra để đảm bảo con trỏ bị đóng và không thành công) và tự hỏi đó có phải là sự cố kết nối python hay nội dung nào đó có sqlite3 hay không. – haridsv

1

Điều thú vị là Python 3.0 doc nói: "Chúng tôi cũng có thể đóng con trỏ nếu chúng ta thực hiện với nó", trong khi doc Python 2.73.6 nói: "Chúng tôi cũng có thể đóng kết nối nếu chúng ta được thực hiện với nó ".

Tài liệu Python 2.7 và 3.0-3.4 không mô tả phương thức con trỏ .close(). Nhưng tài liệu Python 3.5 và 3.6 mô tả phương pháp cursor .close():

Đóng con trỏ ngay bây giờ (thay vì bất cứ khi nào __del__ được gọi).

Con trỏ sẽ không sử dụng được từ thời điểm này trở đi; một ngoại lệ ProgrammingError sẽ được nâng lên nếu bất kỳ thao tác nào được thực hiện với con trỏ.

0

Mã này sẽ tự động đóng Cursor. Nó cũng sẽ tự động đóng và cam kết Connection.

import sqlite3 
import contextlib 

def execute_statement(statement): 
    with contextlib.closing(sqlite3.connect(path_to_file)) as conn: # auto-closes 
     with conn: # auto-commits 
      with contextlib.closing(conn.cursor()) as cursor: # auto-closes 
       cursor.execute(statement) 
Các vấn đề liên quan