J'ai donc essayé de faire une mise à jour de la base de données avec python et lors de la configuration de tout l'environnement de développement, je suis tombé sur ces trois choses qui m'ont donné le vertige.
Il y a MySQLdb
Il y a mysqlclient
- Et puis il y a un connecteur mysql python
Qu'est-ce que chacun d'eux, la différence et où les utiliser? Merci
Réponses:
MySQLdb est un fin wrapper python autour du module C qui implémente l'API pour la base de données MySQL.
Il y avait une version MySQLDb1 de wrapper utilisée il y a quelque temps et maintenant il est considéré comme un héritage. Alors que MySQLDb1 a commencé à évoluer vers MySQLDb2 avec des corrections de bogues et le support de Python3, un MySQLDb1 a été forké et voici comment mysqlclient est apparu, avec des corrections de bogues et le support de Python3. En résumé, nous avons maintenant MySQLDb2 qui n'est pas prêt pour une utilisation en production, MySQLDb1 comme pilote obsolète et un mysqlclient pris en charge par la communauté avec des corrections de bogues et le support de Python3.
Désormais, pour résoudre ce problème, MySQL fournit sa propre version de l'adaptateur MySQL - le connecteur mysql , un module python tout-en-un qui utilise l'API MySQL sans dépendances de modules C et uniquement des modules python standard utilisés.
Alors maintenant, la question se résume à: mysqlclient vs connecteur mysql.
Quant à moi, j'irais avec une bibliothèque officiellement prise en charge, mais
mysqlclient
devrait également être un bon choix. Les deux sont activement mis à jour avec des correctifs et de nouvelles fonctionnalités que vous pouvez voir par des commits actifs ces derniers jours.Remarque: je n'avais pas beaucoup d'expérience avec eux, il peut donc y avoir des cas où l'un ou l'autre ne répond pas à vos besoins. Les deux bibliothèques suivent la norme PEP-249 , ce qui signifie que vous devriez être d'accord avec au moins les fonctionnalités de base partout.
Installation et dépendances
En tant que fork du wrapper C, il nécessite des modules C pour fonctionner avec MySQL qui ajoute des fichiers d'en-tête python pour construire ces extensions (lire python-dev). L'installation dépend du système que vous utilisez, assurez-vous simplement de connaître les noms de paquets et de pouvoir les installer.
la source
Il existe des adaptateurs MySQL pour Python qui sont actuellement maintenus:
mysqlclient
- De loin le connecteur MySQL le plus rapide pour CPython. Nécessite lamysql-connector-c
bibliothèque C pour fonctionner.PyMySQL
- Client pur Python MySQL. Selon le responsable des deuxmysqlclient
etPyMySQL
, vous devez utiliserPyMySQL
si:libmysqlclient
pour une raison quelconque.mysql-connector-python
- Connecteur MySQL développé par le groupe MySQL chez Oracle, également écrit entièrement en Python. Sa performance semble être la pire des trois. De plus, en raison de problèmes de licence, vous ne pouvez pas le télécharger à partir de PyPI (mais il est maintenant disponible via conda).Benchmarks
Selon les benchmarks suivants,
mysqlclient
est plus rapide (parfois> 10x plus rapide) que les clients Python purs.la source
PyMySQL
soit toujours la voie à suivre si vous utilisez PyPy.mysqlclient
est le connecteur par défaut utilisé par sqlalchemy lorsque l'URL de votre base de données commence parmysql://...
. Pour l'utiliserPyMySQL
, démarrez votre URL avecmysql+pymysql://...
. Pour l'utilisermysql-connector-python
, démarrez votre URL avecmysql+mysqlconnector://...
. Consultez la documentation de sqlalchemy pour plus d'informations.Restez fidèle à mysqlclient si vous voulez un accès plus rapide et un accès répétitif
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]
Boucle ... du benchmarking précédent ...
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
la source