Was ist der Unterschied zwischen MySQLdb, mysqlclient und MySQL Connector / Python?

92

Also habe ich versucht, ein Datenbank-Update mit Python durchzuführen, und beim Einrichten der gesamten Entwicklungsumgebung bin ich auf diese drei Dinge gestoßen, die mich schwindelig gemacht haben.

  1. Es gibt MySQLdb

  2. Es gibt mysqlclient

  3. Und dann gibt es noch eine MySQL-Connector-Python

Was ist jeder von ihnen, der Unterschied und wo man sie verwendet? Vielen Dank

आनंद
quelle
1
Die meisten Sprachen verfügen über mehrere Datenbankadapterschichten mit unterschiedlichem Anspruch, Support und Qualität.
Tadman
mysqlclient ist eine gegabelte Version von MySQLdb mit Python3.3 + -Unterstützung, und der MySQL-Connector ist ein offizielles Modul von MySQL.
Warungman
3
Wir haben auch pymysql
Cenk Alti

Antworten:

80

MySQLdb ist ein dünner Python-Wrapper um das C-Modul, der die API für die MySQL-Datenbank implementiert.

Vor einiger Zeit wurde die MySQLDb1- Version des Wrappers verwendet, und jetzt wird sie als Vermächtnis angesehen. Als sich MySQLDb1 mit Fehlerkorrekturen und Python3-Unterstützung zu MySQLDb2 entwickelte , wurde ein MySQLDb1 gegabelt, und so sah mysqlclient mit Bugfixes und Python3-Unterstützung aus. Zusammenfassend lässt sich sagen, dass wir jetzt MySQLDb2 haben, das nicht für die Produktion bereit ist, MySQLDb1 als veralteten Treiber und eine von der Community unterstützte mysqlclient mit Fehlerkorrekturen und Python3-Unterstützung.

Um dieses Problem zu lösen, bietet MySQL eine eigene Version des MySQL-Adapters - den MySQL- Connector , ein All-In-Python-Modul, das die MySQL-API ohne Abhängigkeiten von C-Modulen und nur mit Standard-Python-Modulen verwendet.

Nun kommt die Frage: mysqlclient vs mysql connector.

Ich würde mich für eine offiziell unterstützte Bibliothek entscheiden, mysqlclientsollte aber auch eine gute Wahl sein. Beide werden aktiv mit Korrekturen und neuen Funktionen aktualisiert, die Sie durch aktive Commits in den letzten Tagen sehen können.

Hinweis: Ich hatte nicht viel Erfahrung mit ihnen, daher kann es Fälle geben, in denen der eine oder andere nicht Ihren Anforderungen entspricht. Beide Bibliotheken folgen dem PEP-249- Standard.

Installation und Abhängigkeiten

  • mysqlclient

Als Fork des C-Wrappers müssen C-Module mit MySQL zusammenarbeiten, das Python-Header-Dateien hinzufügt, um diese Erweiterungen zu erstellen (lesen Sie python-dev). Die Installation hängt vom verwendeten System ab. Stellen Sie lediglich sicher, dass Sie die Paketnamen kennen und diese installieren können.

Taras Matsyk
quelle
69

Es gibt dich MySQL-Adapter für Python, die derzeit gepflegt werden:

  • mysqlclient- Mit Abstand der schnellste MySQL-Connector für CPython. Erfordert, dass die mysql-connector-cC-Bibliothek funktioniert.

  • PyMySQL- Reiner Python MySQL Client. Laut dem Betreuer von beiden mysqlclientundPyMySQL sollten Sie verwenden, PyMySQLwenn:

    • Sie können libmysqlclientaus irgendeinem Grund nicht verwenden .
    • Sie möchten einen monkeypatched Socket von gevent oder eventlet verwenden.
    • Sie wollen das MySQL-Protokoll nicht hacken.
  • mysql-connector-python- MySQL-Connector, entwickelt von der MySQL-Gruppe bei Oracle, ebenfalls vollständig in Python geschrieben. Die Leistung scheint die schlechteste unter den dreien zu sein. Aufgrund einiger Lizenzprobleme können Sie es auch nicht von PyPI herunterladen (es ist jetzt über conda erhältlich).

Benchmarks

Laut den folgenden Benchmarks mysqlclientist es schneller (manchmal> 10x schneller) als die reinen Python-Clients.

ostrokach
quelle
2
Es sieht also so aus, als wäre PyMySQLes immer noch der richtige Weg, wenn Sie PyPy verwenden.
Radtek
Falls Sie Probleme beim Kompilieren von mysqlclient haben, können Sie es über das Radpaket installieren, wie hier beschrieben: stackoverflow.com/a/31077052/2848256
Искрен Станиславов
unterstützt sqlalchemy mysqlclient?
Vishal
4
@vishal AFAIK mysqlclientist der Standard-Connector, der von sqlalchemy verwendet wird, wenn Ihre Datenbank-URL mit beginnt mysql://.... Um die Verwendung PyMySQL, starten Sie Ihre URL mit mysql+pymysql://.... Um die Verwendung mysql-connector-python, starten Sie Ihre URL mit mysql+mysqlconnector://.... Weitere Informationen finden Sie in den sqlalchemy-Dokumenten .
Ostrokach
12

Viele Optionen von Benutzern zur Verfügung gestellt. Etwas spät zum Feiern. Aber meine 2 Cent in mit Benchmarking für Pypy 3.7 Version.

Halten Sie sich an mysqlclient, wenn Sie einen schnelleren und sich wiederholenden Zugriff wünschen

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]

Schleife ... vom vorherigen Benchmarking ...

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
Doogle
quelle