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.
Es gibt MySQLdb
Es gibt mysqlclient
- Und dann gibt es noch eine MySQL-Connector-Python
Was ist jeder von ihnen, der Unterschied und wo man sie verwendet? Vielen Dank
Antworten:
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,
mysqlclient
sollte 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
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.
quelle
Es gibt dich MySQL-Adapter für Python, die derzeit gepflegt werden:
mysqlclient
- Mit Abstand der schnellste MySQL-Connector für CPython. Erfordert, dass diemysql-connector-c
C-Bibliothek funktioniert.PyMySQL
- Reiner Python MySQL Client. Laut dem Betreuer von beidenmysqlclient
undPyMySQL
sollten Sie verwenden,PyMySQL
wenn:libmysqlclient
aus irgendeinem Grund nicht verwenden .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
mysqlclient
ist es schneller (manchmal> 10x schneller) als die reinen Python-Clients.quelle
PyMySQL
es immer noch der richtige Weg, wenn Sie PyPy verwenden.mysqlclient
ist der Standard-Connector, der von sqlalchemy verwendet wird, wenn Ihre Datenbank-URL mit beginntmysql://...
. Um die VerwendungPyMySQL
, starten Sie Ihre URL mitmysql+pymysql://...
. Um die Verwendungmysql-connector-python
, starten Sie Ihre URL mitmysql+mysqlconnector://...
. Weitere Informationen finden Sie in den sqlalchemy-Dokumenten .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
quelle