2009-12-30 22 views
10

Hãy nói rằng bạn phải đoạn mã sau:Làm cách nào để biết liệu kết nối cơ sở dữ liệu Python SQLite hoặc con trỏ có được đóng không?

import sqlite3 

conn = sqlite3.connect('mydb') 
cur = conn.cursor() 
# some database actions 
cur.close() 
conn.close() 
# more code below 

Nếu tôi cố gắng sử dụng conn hoặc cur đối tượng sau này, làm thế nào tôi có thể nói rằng họ đang đóng cửa? Tôi không thể tìm thấy phương thức .isclosed() hoặc bất kỳ thứ gì giống như phương pháp đó.

Trả lời

10

Bạn có thể bọc trong một tuyên bố try, except:

>>> conn = sqlite3.connect('mydb') 
>>> conn.close() 
>>> try: 
... resultset = conn.execute("SELECT 1 FROM my_table LIMIT 1;") 
... except sqlite3.ProgrammingError as e: 
... print e 
Cannot operate on a closed database. 

này dựa trên một shortcut specific to sqlite3.

+7

Phương pháp này là lành mạnh, nhưng tránh thực hiện 'SELECT * FROM mytable' trong khi bạn có thể làm nhẹ hơn' SELECT one_column FROM mytable LIMIT 1'. Trước đây là khủng khiếp không hiệu quả là bạn có một cơ sở dữ liệu không nhỏ. –

+0

cảm ơn @pitrou, được cập nhật để xem xét điều đó. – bernie

+3

@AntoineP. bạn đang nhầm lẫn với SQLite với các cơ sở dữ liệu khác. Không có sự khác biệt về số lượng công việc được thực hiện bởi SQLite. Nó không tính toán tất cả các kết quả cho một truy vấn trả trước - thay vào đó nó có số lượng công việc ít nhất có thể để đưa ra hàng kết quả đầu tiên. Hàng kết quả thứ hai chỉ được thực hiện khi bạn yêu cầu. Do đó giới hạn không có hiệu lực. Trong mọi trường hợp, truy vấn tốt hơn là truy vấn không phụ thuộc vào lược đồ - ví dụ: user_version PRAGMA. –

0

Làm thế nào để đảm bảo rằng kết nối và con trỏ không bao giờ bị đóng?

Bạn có thể có một chương trình dựa trên trạng thái mà bạn có thể đảm bảo chỉ các cuộc gọi gần() vào đúng thời điểm.

Hoặc quấn chúng trong các đối tượng khác có triển khai thực hiện là close(). Hoặc thêm thành viên _isclosed được thiết lập bởi close() và truy cập bằng isclosed().

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