166 votes

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

Alors j'ai essayé de faire quelques mise à jour de la base de données avec python et lors de la configuration de l'ensemble de l'environnement de dev, je suis tombé sur ces trois choses qui m'a le vertige.

  1. Il y a MySQLdb

  2. Il y a mysqlclient

  3. Et puis, il y a un connecteur mysql python

Ce que chacun d'entre eux, la différence et où les utiliser? Merci

124voto

ostrokach Points 4704

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

  • mysqlclient - De loin le plus rapide MySQL connector pour Disponible. Nécessite l' mysql-connector-c C bibliothèque pour travailler.

  • PyMySQL - Pur Python MySQL client. Selon le responsable de la les deux mysqlclient et MyPySQL, vous devez utiliser PyMySQL si:

    • Vous ne pouvez pas utiliser libmysqlclient , pour une raison quelconque.
    • Vous souhaitez utiliser monkeypatched prise de gevent ou eventlet.
    • Vous wan pas de hack mysql protocole.
  • mysql-connector-python - MySQL connector développé par MySQL groupe à Oracle, également entièrement écrit en Python. C'est la performance semble être le pire des trois. Aussi, en raison de certains problèmes de licence, vous ne pouvez pas le télécharger à partir de PyPI (mais il est maintenant disponible par le biais de conda).

Repères

Selon les références suivantes, mysqlclient est plus rapide (parfois > 10x plus rapide) que le pur Python clients.

118voto

Taras Matsyk Points 1805

MySQLdb est une mince wrapper python autour de C module qui implémente l'API de base de données MySQL.

Il n'y a MySQLDb1 version d'emballage utilisé il y a quelques temps et maintenant il est considéré comme un héritage. Comme MySQLDb1 a commencé à évoluer à MySQLDb2 avec des corrections de bugs et Python3 soutien, un MySQLDb1 était fourchue et voici comment mysqlclient est apparue, avec des corrections de bugs et Python3 de soutien. Bref, nous avons donc maintenant MySQLDb2 qui n'est pas prêt pour une utilisation en production, MySQLDb1 comme un pilote obsolète et soutenue par la communauté mysqlclient avec des corrections de bugs et Python3 de soutien.

Maintenant, pour résoudre ce gâchis, MySQL fournit sa propre version de MySQL adaptateur - connecteur mysql, un module python qui utilise l'API MySQL avec aucun des modules en C dépendances et seuls les modules standards de python utilisée.

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

Quant à moi, j'irais avec officiellement prise en charge de la bibliothèque, toutefois mysqlclient devrait être un bon choix aussi bien. Deux d'entre eux sont activement mis à jour avec des correctifs et de nouvelles fonctionnalités que vous pouvez voir par actif s'engage dans les derniers jours.

Note: je n'ai pas beaucoup d'expérience avec eux, alors il pourrait y avoir des cas où un ou l'autre n'est pas la suite de vos besoins. Les deux bibliothèques de suivre PEP-249 standard, ce qui signifie que vous devez être bien avec au moins la fonctionnalité de base de partout.

Installation et Dépendances

  • mysqlclient

Comme un fork de C wrapper il nécessite des modules en C pour travailler avec MySQL qui ajoute python fichiers d'en-tête pour la construction de 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.

30voto

Doogle Points 535

Beaucoup d'options fournies par les utilisateurs. Petit tard pour faire la fête. Mais mes deux sous avec l'analyse comparative de la version 3.7 de Pypy.

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X