разница между объектами курсора и соединения

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


person Aman Deep Gautam    schedule 18.05.2012    source источник


Ответы (3)


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

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

person Toote    schedule 18.05.2012
comment
можем ли мы иметь два курсора одновременно. Если да, упомяните о проблемах параллелизма - person Aman Deep Gautam; 19.05.2012
comment
все эти детали скрыты в зависимости от базовой реализации. Вам нужно будет прочитать документацию соответствующего драйвера БД - person Toote; 19.05.2012
comment
Согласно Википедии: в компьютерных науках курсор базы данных — это управляющая структура, которая позволяет перемещаться по записям в базе данных. Курсоры облегчают последующую обработку в сочетании с обходом, например поиск, добавление и удаление записей базы данных. . То, как Python реализует курсоры, плохо согласуется с этим описанием — если бы они были простыми итераторами, они бы не отвечали за выполнение операторов SQL. Разве это не что-то конкретное для python? И что-то, что заслуживает объяснения? - person skyking; 20.04.2017
comment
@skyking: последнее предложение этой цитаты отвечает на ваш вопрос, курсоры предназначены не только для обхода, они облегчают операции, которые на самом деле требуют выполнения запроса: поиск, добавление и удаление. И именно поэтому сам курсор используется как для выполнения запроса, так и для работы с его результатами вместо отдельных объектов или абстракций. - person Toote; 02.05.2017
comment
@Toote Я не думаю, что в Википедии очень четко указано, что стандартное поведение курсора - использовать его для выдачи нового запроса, а не просто обрабатывать его результат. Следующее предложение в статье сравнивает его с итератором. Кроме того, ссылка MySQL и postgres очень похожа на метод обработки результата, а не на выдачу запросов. Кроме того, API Android, по-видимому, не включает в себя выдачу новых запросов из курсора, как и API Berkley DB. Мне кажется, что способ, которым Python это делает, отличается, что делает его несколько специфичным для Python. - person skyking; 03.05.2017
comment
@skyking Python имеет стандартный интерфейс для баз данных, которые таким образом реализуют курсоры. Насколько я понимаю, такой интерфейс соответствует предоставленному вами определению курсора базы данных из Википедии, в то время как другие интерфейсы делают или нет - или реализуют другую интерпретацию определения - зависит от того, кто реализовал интерфейс - person Toote; 30.05.2017

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

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

person SingleNegationElimination    schedule 18.05.2012

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

person John Gaines Jr.    schedule 18.05.2012
comment
я сомневаюсь, что это итератор, потому что есть команда execute (sql_string), которая выполняет строку sql. Ни один итератор для набора результатов не имеет смысла иметь такую ​​​​функцию. - person Aman Deep Gautam; 19.05.2012
comment
Вы правы, но курсор это не только структура на клиенте но и на сервере. Он помогает использовать подготовленные операторы SQL, выполнять их и, после их выполнения, перебирать его результаты. - person Toote; 19.05.2012