2015-12-30 3 views
3

Я довольно новичок в Python и Flask, и, работая над примерами, не мог не заметить курсоры. До этого я программировал на PHP, где мне никогда не нужны курсоры. Поэтому мне стало интересно: что такое курсоры и почему они так много используют в этих примерах кода?Почему в mysqlclient нет курсоров?

Но где бы я ни повернулся, я не видел ясный вердикт и много предупреждений:

  • Wikipedia: «Извлечение строки из курсора может привести к сети туда и обратно каждый раз, когда» и «курсоры распределять ресурсы на сервере, такие как блокировки, пакеты, процессы и временное хранилище ».
  • StackOverflow: См. Ответ от AndreasT.
  • The Island of Misfit Cursors: «Хороший разработчик никогда не отказывается использовать инструмент только потому, что его часто неправильно используют другие».

И в довершение всего, я узнал, что MySQL не поддерживает курсоры!

Похоже, что единственным кодом, который не использует курсоры в библиотеке mysqlclient, является модуль _msql, и автор неоднократно предупреждает об использовании его по соображениям совместимости: «Если вы хотите писать приложения, которые переносятся через базы данных , используйте MySQLdb и не используйте этот модуль напрямую ».

Надеюсь, я достаточно хорошо объяснил и поддержал свою дилемму. Вот два больших вопроса, которые беспокоят меня:

  1. Поскольку MySQL не поддерживает курсоры, в чем смысл построения всего объекта в иерархии классов курсора?
  2. Почему не курсоры необязательны в mysqlclient?

ответ

1

Ваши путающие курсоры уровня базы данных и курсоры db-api Python. Во-вторых, они существуют только на уровне кода Python и не обязательно привязаны к уровням базы данных.

На уровне Python курсоры - это способ инкапсуляции запроса и его результатов. Этот уровень абстракции позволяет иметь простой, полезный и общий api для разных поставщиков. Является ли фактическая реализация для конкретного поставщика основанным на курсорах уровня базы данных или нет, является совершенно другой проблемой.

Чтобы сделать длинную историю Короче говоря, существует два различных понятия здесь:

  1. базы данных (сервер) курсоры, функция, которая существует в некоторых, но не все SQL двигатели
  2. DB API (клиент) курсоры (как определено в pep 249), которые используются для выполнения запроса и в конечном итоге извлекают результаты.

дб API курсоры названы так потому, что они концептуально имеют некоторое сходство с курсорами база данных, но технически совершенно несвязанной.

Что касается того, почему mysqlclient работает таким образом, это просто: он реализует pep 249, который является определяемым сообществом API для клиентов баз данных Python SQL.

+0

Я не думаю, что я запутал проблему. В моем вопросе конкретно упоминается библиотека 'mysqlclient', которая построена на' MySQLdb' и, как ожидается, будет поддерживать только MySQL. И я не уверен, что согласен с общей практикой API. Почему дизайнер библиотеки накладывает на меня курсоры? Что делать, если я не хочу использовать курсоры в некоторых ситуациях, даже если базовый движок поддерживает их? Они должны быть необязательными (это мой вопрос № 2). – dotslash

+0

Да, вы путаете проблемы. Класс 'Cursor' в' mysqlclient' НЕ является курсором уровня базы данных («курсор сервера»), поэтому вся ваша точка зрения * курсора уровня базы данных просто спорна. И никто не заставляет вас использовать курсоры уровня * базы данных * на поддерживающих их механизмах БД (например, dc http://icitd.org/psycopg/docs/usage.html#server-side-cursors). –

+0

«так что вся ваша точка зрения курсоров уровня базы просто спорна». Когда я был в курсе курсоров на уровне базы данных? На самом деле, ссылка, которую вы поделились спорно, потому что этот вопрос относится только к MySQL. Но позвольте мне перефразировать исходный вопрос так, как я думаю, вы поймете: поскольку у MySQL нет курсоров на уровне базы данных, почему 'mysqlclient', библиотека, посвященная MySQL, маскируется как реализация курсора? Является простой лени? Или библиотека делает какие-то закулисные вещи? Ответьте только, если вы можете ответить в контексте 'mysqlclient'. Мне не нужен аргумент. – dotslash

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