web-dev-qa-db-fra.com

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

Donc, j'ai essayé de faire une mise à jour de base de données avec python et en configurant 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

Quelle est chacune d'entre elles, quelle est la différence et où les utiliser? Merci

53
आनंद

MySQLdb est un fin python encapsuleur 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 elle est maintenant considérée comme un héritage. Alors que MySQLDb1 commençait à évoluer vers MySQLDb2 avec corrections de bugs et support Python3, un MySQLDb1 était créé et voici comment mysqlclient est apparu, avec corrections de bug et support Python3. En résumé, nous avons maintenant MySQLDb2 qui n'est pas prêt pour une utilisation en production, MySQLDb1 en tant que pilote obsolète et une communauté prise en charge par mysqlclient avec des correctifs de bogues et un support Python3.

Maintenant, pour résoudre ce désordre, MySQL fournit sa propre version de l'adaptateur MySQL - connecteur mysql , un module python tout-en-un qui utilise l'API MySQL avec pas de dépendances des modules C et uniquement les modules standard python utilisés.

Alors maintenant, la question se résume à: mysqlclient vs mysql connector.

Pour ma part, je choisirais une bibliothèque officiellement prise en charge, mais mysqlclient devrait également être un bon choix. Tous deux sont activement mis à jour avec des correctifs et de nouvelles fonctionnalités que vous pouvez voir grâce aux validations actives des derniers jours.

Remarque: je n'avais pas beaucoup d'expérience avec eux, il est donc possible que l'un ou l'autre ne réponde pas à vos besoins. Les deux bibliothèques suivent PEP-249 ce qui signifie que vous devriez pouvoir utiliser au moins une fonctionnalité de base partout.

Installation et dépendances

  • mysqlclient

En tant que fork de C, il nécessite que les modules C travaillent avec MySQL, ce qui ajoute les fichiers d'en-tête python pour construire ces extensions (lisez python-dev). L'installation dépend du système que vous utilisez. Assurez-vous de connaître le nom des packages et pouvez les installer.

54
Taras Matsyk

Il y a trois adaptateurs MySQL pour Python qui sont actuellement maintenus:

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

  • PyMySQL - Pure Python client MySQL. Selon le responsable de mysqlclient et de PyMySQL , vous devez utiliser PyMySQL si:

    • Vous ne pouvez pas utiliser libmysqlclient pour une raison quelconque.
    • Vous voulez utiliser le 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).

Des repères

Selon les tests suivants, mysqlclient est plus rapide (parfois> 10 fois plus vite) que les clients purs Python.

34
ostrokach

Beaucoup d'options fournies par les utilisateurs. Petit tard pour faire la fête. Mais mon 2 cents dans avec l'analyse comparative pour la version pypy 3.7.

Restez sur mysqlclient si vous voulez un accès plus rapide et 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 ... de l'analyse comparative précédente ...

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