Яка різниця між MySQLdb, mysqlclient та MySQL Connector / Python?


91

Тож я намагався оновити базу даних за допомогою python, і, налаштовуючи все середовище розробника, я натрапив на ці три речі, від яких у мене запаморочилося.

  1. Там MySQLdb

  2. Там mysqlclient

  3. А ще є сполучник mysql python

Яка кожна з них, різниця і де їх використовувати? Дякую


1
Більшість мов мають кілька шарів адаптера бази даних різного рівня вишуканості, підтримки та якості.
тадман

mysqlclient - це розгалужена версія MySQLdb з підтримкою python3.3 +, а роз'єм mysql - офіційний модуль від mysql.
warungman

3
У нас також є pymysql
Cenk Alti

Відповіді:


77

MySQLdb - це тонка обгортка пітона навколо модуля C, що реалізує API для бази даних MySQL.

Існувала версія оболонки MySQLDb1, яка використовувалася деякий час тому, і зараз вона вважається застарілою. Коли MySQLDb1 почав еволюціонувати до MySQLDb2 з виправленнями помилок та підтримкою Python3, MySQLDb1 був розгалужений, і ось як з’явився mysqlclient із виправленнями помилок та підтримкою Python3. Підсумовуємо, отже, тепер у нас є MySQLDb2, який не готовий до виробничого використання, MySQLDb1 як застарілий драйвер та підтримка спільноти mysqlclient із виправленнями помилок та підтримкою Python3.

Тепер, щоб вирішити цю халепу, MySQL пропонує власну версію адаптера MySQL - роз'єм mysql , вбудований модуль python, який використовує API MySQL без залежностей від C-модулів і використовує лише стандартні модулі python.

Отже, тепер питання зводиться до: mysqlclient проти роз’єму mysql.

Що стосується мене, я хотів би скористатися офіційно підтримуваною бібліотекою, однак це також mysqlclientмає бути хорошим вибором. Обидва вони активно оновлюються виправленнями та новими функціями, які ви можете побачити під час активних комітів за останні дні.

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

Встановлення та залежності

  • mysqlclient

Як форк обгортки C, йому потрібні модулі C для роботи з MySQL, який додає заголовкові файли python для побудови цих розширень (читайте python-dev). Встановлення залежить від системи, якою ви користуєтесь, просто переконайтесь, що ви знаєте імена пакетів і можете їх встановити.


66

На даний момент підтримуються такі адаптери MySQL для Python:

  • mysqlclient- На сьогоднішній день найшвидший роз’єм MySQL для CPython. Потрібна mysql-connector-cбібліотека C для роботи.

  • PyMySQL- Чистий клієнт MySQL на Python. На думку супровідника обох mysqlclientіPyMySQL , вам слід використовувати, PyMySQLякщо:

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

Тести

Згідно з наступними тестами, mysqlclientце швидше (іноді> в 10 разів швидше), ніж чисті клієнти Python.


2
Отже, схоже, PyMySQLце все ще шлях, якщо використовувати PyPy.
radtek

в разі , якщо у вас є проблеми з компіляції mysqlclient ви можете встановити його з допомогою колеса пакета , як описано тут: stackoverflow.com/a/31077052/2848256
Искрен Станіславів

чи підтримує sqlalchemy mysqlclient?
вішал

4
@vishal AFAIK mysqlclient- це з'єднувач за замовчуванням, який використовується sqlalchemy, коли URL-адреса вашої бази даних починається з mysql://.... Щоб використовувати PyMySQL, почніть свою URL-адресу з mysql+pymysql://.... Щоб використовувати mysql-connector-python, почніть свою URL-адресу з mysql+mysqlconnector://.... Додаткову інформацію див. У документах sqlalchemy .
острокач

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.