Разница между курсором и объектами подключения

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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