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

donc j'ai essayé de faire une mise à jour de la base de données avec python et tout en configurant l'environnement dev entier, je suis tombé sur ces trois choses qui m'ont rendu étourdi.

  1. Il y a MySQLdb

  2. Il y a mysqlclient

  3. et puis il y a un mysql connector python

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

32
demandé sur आनंद 2017-03-29 22:23:52

3 réponses

MySQLdb est un thin Python wrapper autour du module C qui implémente L'API pour la base de données MySQL.

Il y avait MySQLDb1 version de wrapper utilisée il y a quelque temps et maintenant elle est considérée comme un héritage. Comme MySQLDb1 a commencé à évoluer vers MySQLDb2 avec les corrections de bug et le support de Python3, un MySQLDb1 a été bifurqué et voici comment mysqlclient est apparu, avec bugfixes et support de Python3. En résumé, maintenant nous avons MySQLDb2 qui n'est pas prêt à être utilisé en production, MySQLDb1 en tant que pilote obsolète et une communauté a pris en charge mysqlclient avec des corrections de bug et le support de Python3.

maintenant, pour résoudre ce problème, MySQL fournit leur propre version de MySQL adaptateur - connecteur mysql, un module python all-in qui utilise L'API MySQL avec pas de dépendances des modules en C et seulement les modules python standard utilisés.

alors maintenant la question se résume à: mysqlclient vs mysql connecteur.

quant à moi, j'irais avec la bibliothèque officiellement soutenue, cependant mysqlclient devrait être un bon choix aussi bien. Tous les deux sont activement mis à jour avec des corrections et de nouvelles fonctionnalités que vous pouvez voir par des commits actifs dans les derniers jours.

Note: je n'avais pas beaucoup d'expérience avec eux, donc il pourrait y avoir des cas où l'un ou l'autre ne répond pas à vos besoins. Les deux bibliothèques PEP-249 standard ce qui signifie que vous devriez être d'accord avec au moins fonctionnalité de base partout.

Installation et Dépendances

  • mysqlclient

en tant que fork of C wrapper, 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 conscient de noms de paquets et l'installation.

33
répondu Taras Matsyk 2017-07-22 13:14:06

il y a les adaptateurs MySQL pour Python qui sont actuellement maintenus:

  • mysqlclient - de loin le connecteur MySQL le plus rapide pour CPython. Nécessite l' mysql-connector-c C bibliothèque au travail.

  • PyMySQL - pur Python MySQL client. selon le mainteneur des deux mysqlclient et MyPySQL, vous devez utiliser PyMySQL si:

    • Vous ne pouvez pas utiliser libmysqlclient pour certains raison.
    • vous voulez utiliser une socket gevent ou eventlet monkeypatched socket.
    • 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. En outre, en raison de certains problèmes de licence, vous ne pouvez pas le télécharger à partir de PyPI (mais il est maintenant disponible via conda).

Repères

selon les points de repère suivants,mysqlclient est plus rapide (parfois > 10x plus rapide) que les clients Python pur.

13
répondu ostrokach 2018-08-03 17:31:41

beaucoup d'options fournies par les utilisateurs. Peu tard pour faire la fête. Mais mon 2 centimes avec de benchmarking pour pypy version 3.7.

Bâton de mysqlclient si vous voulez un accès plus rapide et répétitive d'accès

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... d'après 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
1
répondu Doogle 2018-10-07 04:19:52