Saltar al contenido

¿Cuál es la diferencia entre MySQLdb, mysqlclient y MySQL connector/Python?

Por fin después de mucho luchar hemos encontrado la contestación de este atolladero que agunos usuarios de nuestro espacio han presentado. Si tienes alguna información que aportar no dudes en compartir tu comentario.

Solución:

MySQLdb es un envoltorio delgado de python alrededor del módulo C que implementa la API para la base de datos MySQL.

Hace algún tiempo se usó la versión MySQLDb1 del contenedor y ahora se considera un legado. Cuando MySQLDb1 comenzó a evolucionar a MySQLDb2 con correcciones de errores y compatibilidad con Python3, se bifurcó MySQLDb1 y así es como apareció mysqlclient, con correcciones de errores y compatibilidad con Python3. En resumen, ahora tenemos MySQLDb2 que no está listo para su uso en producción, MySQLDb1 como un controlador obsoleto y mysqlclient compatible con la comunidad con correcciones de errores y compatibilidad con Python3.

Ahora, para resolver ese lío, MySQL proporciona su propia versión del adaptador MySQL: el conector mysql, un módulo integral de Python que usa la API de MySQL con sin dependencias de módulos C y solo se utilizan módulos Python estándar.

Así que ahora la pregunta se reduce a: mysqlclient vs mysql connector.

En cuanto a mí, iría con una biblioteca con soporte oficial, sin embargo mysqlclient debe ser una buena elección también. Ambos se están actualizando activamente con correcciones y nuevas funciones que puede ver mediante confirmaciones activas en los últimos días.

Nota: No tengo mucha experiencia con ellos, por lo que puede haber casos en los que uno u otro no se adapte a tus necesidades. Ambas bibliotecas siguen el estándar PEP-249, lo que significa que debería estar bien con al menos la funcionalidad básica en todas partes.

Instalación y Dependencias

  • cliente mysql

Como una bifurcación del envoltorio de C, requiere módulos de C para trabajar con MySQL, que agrega archivos de encabezado de python para construir estas extensiones (léase python-dev). La instalación depende del sistema que use, solo asegúrese de conocer los nombres de los paquetes y poder instalarlos.

  • conector mysql La documentación principal es bastante clara, sin embargo, debe tener en cuenta la dependencia de Protobuf C++ (para las versiones del conector mysql >= 2.2.3).

Hay tres adaptadores MySQL para Python que se mantienen actualmente:

  • mysqlclient – Con mucho, el conector MySQL más rápido para CPython. Requiere el mysql-connector-c Biblioteca C para trabajar.

  • PyMySQL – Cliente Python MySQL puro. Según el responsable de ambos mysqlclient y PyMySQLDeberías usar PyMySQL si:

    • no puedes usar libmysqlclient por alguna razón.
    • Desea utilizar un socket con parche de mono de gevent o eventlet.
    • No quieres hackear el protocolo mysql.
  • mysql-connector-python – Conector MySQL desarrollado por el grupo MySQL de Oracle, también escrito íntegramente en Python. Su rendimiento parece ser el peor de los tres. Además, debido a algunos problemas de licencia, no puede descargarlo desde PyPI (pero ahora está disponible a través de conda).

Puntos de referencia

De acuerdo con los siguientes puntos de referencia, mysqlclient es más rápido (a veces > 10 veces más rápido) que los clientes Python puros.

  • Evaluación comparativa de controladores MySQL (Python 3.4)
  • Evaluación PyMySQL
  • Rendimiento de consulta Python MySQLdb vs mysql-connector

Una gran cantidad de opciones proporcionadas por los usuarios. Un poco tarde para la fiesta. Pero mi 2 centavos en adelante con la evaluación comparativa para la versión pypy 3.7.

Apéguese a mysqlclient si desea un acceso más rápido y un acceso repetitivo

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]

Bucle… de la evaluación comparativa anterior…

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

Si haces scroll puedes encontrar las acotaciones de otros programadores, tú asimismo tienes la habilidad mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *