2012-05-18 3 views
10

Я смущен тем, почему python нужен объект курсора. Я знаю jdbc, и там соединение с базой данных довольно интуитивно, но в python меня путают с объектом курсора. Также я сомневаюсь в том, какая разница между функцией cursor.close() и connection.close() с точки зрения выпуска ресурсов.разница между курсором и объектами связи

ответ

13

Парадигма курсора не специфична для Python, но является частой структурой данных в databases themselves.

В зависимости от базовой реализации может быть создано несколько курсоров, которые используют одно и то же соединение с базой данных. Закрытие курсора должно освобождать ресурсы, связанные с запросом, включая любые результаты, никогда не извлекаемые из БД (или извлеченные, но не используемые), но не исключающие соединение с самой базой данных, чтобы вы могли получить новый курсор в той же базе данных без необходимости повторной аутентификации.

+0

У нас есть два курсора одновременно. Если да, то упоминайте о проблемах параллелизма –

+1

все эти детали скрыты в «в зависимости от базовой реализации». Вам нужно будет прочитать документацию соответствующего драйвера DB – Toote

+0

Согласно википедии: «В информатике курсор базы данных - это структура управления, которая позволяет обходить записи в базе данных. Курсоры облегчают последующую обработку в сочетании с обходом, таких как извлечение, добавление и удаление записей базы данных ». То, как Python реализует курсоры, не соответствует этому описанию - если бы они были просто итераторами, они не отвечали бы за выполнение SQL-инструкций. Разве это не что-то специфическое для python? И что-то, что заслуживает объяснения? – skyking

1

Объект подключения - это ваше соединение с базой данных, закройте это, когда вы закончите разговор с базой данных. Объект курсора является итератором по набору результатов из запроса. Закройте их, когда закончите с этим набором результатов.

+2

Я сомневаюсь, что это итератор, потому что есть команда execute (sql_string), которая выполняет строку sql. Для любого итератора для набора результатов не имеет смысла иметь такую ​​функцию. –

+0

Вы правы, но курсор - это не только структура на клиенте, но и на сервере. Он помогает использовать подготовленные операторы SQL, выполнять их и после их выполнения перебирать результаты. – Toote

5

Как упоминают другие, Connection() - это сетевое подключение к базе данных, и только реальное использование - возврат курсоров. PEP-249, где указан DBApi 2.0, четко не определено, что именно представляет собой соединение или курсор, а также то, что должен делать метод close(); только что <module>.connect() должен возвращать экземпляр <module>.Connection , что <module>.Connection.cursor() должен вернуть экземпляр <module>.Cursor и <module>.Cursor.execute() должны ссылаться на заявление при условии возврата и результирующие строки. В частности, он не определяет <module>.Connection.execute() , хотя конкретные реализации могут реализовать их как расширения.

В зависимости от этих расширений, вероятно, неразумно, поскольку это означает, что у вас не будет переносного кода. DBApi делает это двухуровневое требование, потому что выполнение некоторых операций над соединением без промежуточного объекта может быть затруднено в некоторых базах данных.

Смежные вопросы