В чем разница между MySQLdb, mysqlclient и MySQL connector/Python?
поэтому я пытался сделать некоторое обновление базы данных с python и при настройке всей среды разработки я наткнулся на эти три вещи, которые заставили меня головокружение.
здесь MySQLdb
здесь mysqlclient
- и тут mysql разъем python
что каждый из них, разница и где их использовать? Спасибо
3 ответов
MySQLdb - Это тонкая оболочка python вокруг модуля C, которая реализует API для базы данных MySQL.
не было MySQLDb1 версия обертки используется некоторое время назад, и теперь она считается наследием. Как MySQLDb1 начал развиваться до MySQLDb2 с исправлениями ошибок и поддержкой Python3, MySQLDb1 был раздвоен и вот как mysqlclient появился, с исправлениями ошибок и поддержкой Python3. Подводим итог, так что теперь у нас есть MySQLDb2, которого нет готовый к использованию в производстве, MySQLDb1 как устаревший драйвер и сообщество поддерживали mysqlclient с исправлениями ошибок и поддержкой Python3.
теперь, чтобы решить этот беспорядок, MySQL предоставляет свою собственную версию адаптера MySQL -mysql connector, модуль все-в python, который использует MySQL API с нет зависимостей модулей C и используются только стандартные модули python.
Итак, теперь вопрос сводится к: mysqlclient против mysql соединитель.
Что касается меня, я бы пошел с официально поддерживаемой библиотекой, однако mysqlclient
должно быть хорошим выбором.
Оба они активно обновляются с исправлениями и новыми функциями, которые вы можете видеть активных совершает в последние дни.
Примечание: у меня не было большого опыта работы с ними, поэтому могут быть случаи, когда тот или иной не соответствует вашим потребностям. Обе библиотеки следуют PEP-249 standard что означает, что вы должны быть в порядке, по крайней мере базовая функциональность везде.
установка и зависимостей
- mysqlclient
в качестве вилки оболочки C для работы с MySQL требуются модули C, которые добавляют файлы заголовков python для создания этих расширений (read python-dev). Установка зависит от используемой системы, просто убедитесь, что вы знаете имена пакетов и можете их установить.
- разъем для MySQL Главная документация довольно ясно, однако вы должны знать о Protobuf C++ зависимость (для MySQL connector версии >= 2.2.3).
есть адаптеры MySQL для Python, которые в настоящее время поддерживаются:
mysqlclient
- на сегодняшний день самый быстрый MySQL разъем для CPython. Требуетсяmysql-connector-c
библиотека C для работы.-
PyMySQL
- чистый клиент Python MySQL. согласно сопровождающему обоихmysqlclient
иMyPySQL
, вы должны использоватьPyMySQL
Если:- вы не можете использовать
libmysqlclient
для некоторых причина. - вы хотите использовать сокет monkeypatched gevent или eventlet.
- вы не хотите взломать протокол mysql.
- вы не можете использовать
mysql-connector-python
- mysql connector разработан группой MySQL в Oracle, также полностью написан на Python. Похоже, это худшее из трех. Кроме того, из-за некоторых проблем с лицензированием вы не можете загрузить его из PyPI (но теперь он доступен через стадион conda).
критерии
согласно следующим критериям,mysqlclient
быстрее (иногда > 10x быстрее), чем чистые клиенты Python.
много вариантов, предоставляемых пользователями. Поздновато для вечеринки. Но мой 2 центы!--5--> in on с бенчмаркингом для версии 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