В чем разница между MySQLdb, mysqlclient и соединителем MySQL / Python?

91

Итак, я пытался обновить базу данных с помощью python, и при настройке всей среды разработки я наткнулся на эти три вещи, от которых у меня закружилась голова.

  1. Есть MySQLdb

  2. Есть mysqlclient

  3. И еще есть питон соединителя mysql

В чем каждое из них, чем они отличаются и где их использовать? Благодарность

आनंद
источник
1
Большинство языков имеют несколько уровней адаптера базы данных разного уровня сложности, поддержки и качества.
tadman
mysqlclient - это разветвленная версия MySQLdb с поддержкой python3.3 +, а коннектор mysql - официальный модуль от mysql.
warungman
3
У нас также есть pymysql
Cenk

Ответы:

77

MySQLdb - это тонкая оболочка Python вокруг модуля C, которая реализует API для базы данных MySQL.

Был MySQLDb1 версия обертки использовали некоторое время назад , и теперь он считается наследием. Когда MySQLDb1 начал развиваться до MySQLDb2 с исправлениями ошибок и поддержкой Python3, MySQLDb1 был разветвлен, и вот как появился mysqlclient с исправлениями ошибок и поддержкой Python3. Подводя итог, теперь у нас есть MySQLDb2, который не готов к производственному использованию, MySQLDb1 как устаревший драйвер и сообщество, поддерживающее mysqlclient с исправлениями ошибок и поддержкой Python3.

Теперь, чтобы решить этот беспорядок, MySQL предоставляет свою собственную версию адаптера MySQL - соединитель mysql , комплексный модуль Python, который использует MySQL API без зависимостей модулей C и использует только стандартные модули Python.

Итак, теперь вопрос сводится к следующему: mysqlclient vs mysql connector.

Что касается меня, я бы mysqlclientвыбрал официально поддерживаемую библиотеку, но это тоже должно быть хорошим выбором. Оба они активно обновляются исправлениями и новыми функциями, которые вы можете увидеть по активным коммитам в последние дни.

Примечание: у меня не было большого опыта работы с ними, поэтому могут быть случаи, когда тот или иной не соответствует вашим потребностям. Обе библиотеки соответствуют стандарту PEP-249, что означает, что вы должны быть в порядке, по крайней мере, с базовой функциональностью везде.

Установка и зависимости

  • mysqlclient

Как ответвление оболочки C, он требует модулей C для работы с MySQL, который добавляет файлы заголовков python для создания этих расширений (см. Python-dev). Установка зависит от используемой вами системы, просто убедитесь, что вы знаете имена пакетов и можете их установить.

Тарас Мацык
источник
66

В настоящее время поддерживаются следующие адаптеры MySQL для Python:

  • mysqlclient- Безусловно, самый быстрый коннектор MySQL для CPython. Для работы требуется mysql-connector-cбиблиотека C.

  • PyMySQL- Чистый клиент Python MySQL. По словам сопровождающего обоих mysqlclientиPyMySQL , вам следует использовать PyMySQLif:

    • По libmysqlclientкакой-то причине нельзя использовать .
    • Вы хотите использовать сокет gevent или eventlet с обезьяной.
    • Вы не хотите взламывать протокол mysql.
  • mysql-connector-python- Коннектор MySQL, разработанный группой MySQL в Oracle, также полностью написанный на Python. Его производительность оказалась худшей из трех. Кроме того, из-за некоторых проблем с лицензированием вы не можете загрузить его из PyPI (но теперь он доступен через conda).

Контрольные точки

Согласно следующим тестам, mysqlclientработает быстрее (иногда более чем в 10 раз), чем клиенты на чистом Python.

острокач
источник
2
Так что, похоже, PyMySQLэто все еще путь, если вы используете PyPy.
radtek
если у вас возникли проблемы с компиляцией mysqlclient, вы можете установить его через пакет wheel, как описано здесь: stackoverflow.com/a/31077052/2848256
Искрен Станиславов 08
поддерживает ли sqlalchemy mysqlclient?
vishal 03
4
@vishal AFAIK mysqlclient- это коннектор по умолчанию, используемый sqlalchemy, когда URL-адрес вашей базы данных начинается с mysql://.... Чтобы использовать PyMySQL, начните свой URL с mysql+pymysql://.... Чтобы использовать mysql-connector-python, начните свой URL с mysql+mysqlconnector://.... См. Документацию sqlalchemy для получения дополнительной информации.
ostrokach 03
11

Множество опций предоставлено пользователями. Немного поздно на вечеринку. Но мои 2 цента на тестировании для версии pypy 3.7.

Придерживайтесь mysqlclient, если вам нужен более быстрый и повторяющийся доступ

MySQL Connector/Python: 23.096168518066406 [sec]
mysqlclient: 6.815327882766724 [sec]
PyMySQL: 24.616853952407837 [sec]
MySQL Connector/Python: 22.619106769561768 [sec]
mysqlclient: 6.607790231704712 [sec]
PyMySQL: 24.410773038864136 [sec]

Цикл ... из предыдущего тестирования ...

def q100k(cur):
    t = time.time()
    for _ in range(100000):
        cur.execute("SELECT 1,2,3,4,5,6")
        res = cur.fetchall()
        assert len(res) == 1
        assert res[0] == (1, 2, 3, 4, 5, 6)
    return time.time() - t
Дугл
источник