2012-05-18 38 views
10

Tôi nhầm lẫn về lý do tại sao python cần đối tượng con trỏ. Tôi biết jdbc và có kết nối cơ sở dữ liệu khá trực quan nhưng trong python tôi đang bối rối với đối tượng con trỏ. Ngoài ra tôi nghi ngờ về sự khác nhau giữa hàm cursor.close() và connection.close() trong điều khoản phát hành tài nguyên là gì.Sự khác biệt giữa đối tượng con trỏ và đối tượng kết nối

Trả lời

13

Mô hình con trỏ không dành riêng cho Python nhưng là cấu trúc dữ liệu thường xuyên trong databases themselves.

Tùy thuộc vào triển khai cơ bản, có thể tạo ra một số con trỏ chia sẻ cùng một kết nối với cơ sở dữ liệu. Đóng con trỏ nên các tài nguyên miễn phí liên quan đến truy vấn, bao gồm mọi kết quả không bao giờ được lấy từ DB (hoặc được tìm nạp nhưng không được sử dụng) nhưng sẽ không loại bỏ kết nối với cơ sở dữ liệu để bạn có thể có được một con trỏ mới trên cùng một cơ sở dữ liệu mà không cần xác thực lại.

+0

chúng ta có thể có hai con trỏ cùng một lúc. Nếu có, hãy đề cập đến các vấn đề tương tranh –

+1

tất cả các chi tiết đó đều bị ẩn trong "tùy thuộc vào việc triển khai cơ bản". Bạn sẽ phải đọc tài liệu về trình điều khiển DB tương ứng – Toote

+0

Theo wikipedia: "Trong khoa học máy tính, con trỏ cơ sở dữ liệu là cấu trúc điều khiển cho phép truyền tải qua các bản ghi trong cơ sở dữ liệu. chẳng hạn như truy xuất, thêm và loại bỏ các bản ghi cơ sở dữ liệu. ". Cách Python thực hiện các con trỏ không phù hợp tốt với mô tả đó - nếu chúng chỉ là các trình vòng lặp, chúng sẽ không chịu trách nhiệm thực hiện các câu lệnh SQL. Không phải là một cái gì đó python cụ thể? Và cái gì đó xứng đáng là một lời giải thích? – skyking

1

Đối tượng kết nối là kết nối của bạn với cơ sở dữ liệu, đóng lại khi bạn hoàn tất việc nói chuyện với cơ sở dữ liệu cùng nhau. Đối tượng con trỏ là một trình lặp trên một tập kết quả từ một truy vấn. Đóng các kết nối đó khi bạn đã hoàn tất bộ kết quả đó.

+2

tôi nghi ngờ rằng nó là một trình lặp bởi vì có một lệnh như là thực thi (sql_string) thực hiện một chuỗi sql. Nó không có ý nghĩa đối với bất kỳ trình lặp nào cho tập kết quả có chức năng như vậy –

+0

Bạn nói đúng, nhưng con trỏ không chỉ là cấu trúc trên máy khách mà còn trên máy chủ. Nó giúp sử dụng các câu lệnh SQL đã chuẩn bị, thực hiện chúng và sau khi chúng được thực thi, lặp lại kết quả của nó. – Toote

5

Như những người khác đề cập, một Connection() là kết nối mạng với cơ sở dữ liệu và chỉ sử dụng thực sự là trả lại con trỏ. PEP-249, trong đó DBApi 2.0 được chỉ định, không xác định chính xác kết nối hoặc con trỏ chính xác, cũng không phải phương thức close() trên mỗi phải làm; duy nhất mà <module>.connect() phải trở về một thể hiện của <module>.Connection , mà <module>.Connection.cursor() phải trở về một thể hiện của <module>.Cursor , và <module>.Cursor.execute() nên gọi tuyên bố cung cấp và trả lại hàng kết quả. Cụ thể, nó không xác định <module>.Connection.execute() , mặc dù triển khai cụ thể là miễn phí để triển khai chúng dưới dạng tiện ích mở rộng.

Tùy thuộc vào các tiện ích mở rộng đó có lẽ là không khôn ngoan, vì điều đó có nghĩa là bạn sẽ không có mã di động. DBApi làm cho yêu cầu hai cấp này vì việc thực hiện kết nối mà không có đối tượng trung gian có thể gặp khó khăn trên một số cơ sở dữ liệu.

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