Я смущен тем, что для 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
Объект подключения - это ваше соединение с базой данных, закройте это, когда вы закончите разговор с базой данных. Объект курсора является итератором по набору результатов из запроса. Закройте их, когда вы закончите с этим набором результатов.