Quelle est la différence entre MySQLdb, mysqlclient et MySQL Connector / Python?


91

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.

  1. Il y a MySQLdb

  2. Il y a mysqlclient

  3. Et puis il y a un connecteur mysql python

Qu'est-ce que chacun d'eux, la différence et où les utiliser? Merci


1
La plupart des langages ont plusieurs couches d'adaptateur de base de données de différents niveaux de sophistication, de support et de qualité.
tadman

mysqlclient est une version fourchue de MySQLdb avec le support de python3.3 +, et le connecteur mysql est le module officiel de mysql.
warungman

3
Nous avons aussi pymysql
Cenk Alti

Réponses:


77

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 mysqlclientdevrait é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

  • mysqlclient

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.


66

Il existe des adaptateurs MySQL pour Python qui sont actuellement maintenus:

  • mysqlclient- De loin le connecteur MySQL le plus rapide pour CPython. Nécessite la mysql-connector-cbibliothèque C pour fonctionner.

  • PyMySQL- Client pur Python MySQL. Selon le responsable des deux mysqlclientetPyMySQL , vous devez utiliser PyMySQLsi:

    • Vous ne pouvez pas utiliser libmysqlclientpour une raison quelconque.
    • Vous souhaitez utiliser une socket monkeypatched de gevent ou eventlet.
    • Vous ne voulez pas pirater le protocole mysql.
  • 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, mysqlclientest plus rapide (parfois> 10x plus rapide) que les clients Python purs.


2
Il semble donc que ce PyMySQLsoit toujours la voie à suivre si vous utilisez PyPy.
radtek

au cas où vous auriez des problèmes avec la compilation de mysqlclient, vous pouvez l'installer via le package wheel comme décrit ici: stackoverflow.com/a/31077052/2848256
Искрен Станиславов

sqlalchemy prend-il en charge mysqlclient?
vishal le

4
@vishal AFAIK mysqlclientest le connecteur par défaut utilisé par sqlalchemy lorsque l'URL de votre base de données commence par mysql://.... Pour l'utiliser PyMySQL, démarrez votre URL avec mysql+pymysql://.... Pour l'utiliser mysql-connector-python, démarrez votre URL avec mysql+mysqlconnector://.... Consultez la documentation de sqlalchemy pour plus d'informations.
ostrokach

11

Beaucoup d'options fournies par les utilisateurs. Un peu tard pour faire la fête. Mais mes 2 cents dans le benchmarking pour la version pypy 3.7.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.