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

91

Así que he estado tratando de actualizar la base de datos con Python y mientras configuraba todo el entorno de desarrollo, encontré estas tres cosas que me marearon.

  1. Hay MySQLdb

  2. Hay mysqlclient

  3. Y luego hay un conector de mysql python

¿Cuál es cada uno de ellos, la diferencia y dónde usarlos? Gracias

आनंद
fuente
1
La mayoría de los lenguajes tienen varias capas de adaptadores de bases de datos con distintos niveles de sofisticación, soporte y calidad.
tadman
mysqlclient es una versión bifurcada de MySQLdb con soporte para python3.3 +, y el conector mysql es un módulo oficial de mysql.
warungman
3
También tenemos pymysql
Cenk Alti

Respuestas:

77

MySQLdb es una envoltura delgada de Python alrededor del módulo C que implementa API para la base de datos MySQL.

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

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

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

En cuanto a mí, optaría por una biblioteca con soporte oficial, sin embargo, también mysqlclientdebería ser una buena opción. Ambos se están actualizando activamente con correcciones y nuevas funciones que puede ver en las 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 sus 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

  • mysqlclient

Como una bifurcación de la envoltura de C, requiere que los módulos de C funcionen con MySQL, lo que agrega archivos de encabezado de Python para construir estas extensiones (lea python-dev). La instalación depende del sistema que utilice, solo asegúrese de conocer los nombres de los paquetes y de poder instalarlos.

Taras Matsyk
fuente
66

Hay tres adaptadores MySQL para Python que se mantienen actualmente:

  • mysqlclient- Con mucho, el conector MySQL más rápido para CPython. Requiere que la mysql-connector-cbiblioteca C funcione.

  • PyMySQL- Cliente puro Python MySQL. Según el responsable de mantenimiento de ambos mysqlclientyPyMySQL , debe usar PyMySQLsi:

    • No se puede usar libmysqlclientpor alguna razón.
    • Desea utilizar el socket parcheado de mono de gevent o eventlet.
    • No querrás hackear el protocolo mysql.
  • mysql-connector-python- Conector MySQL desarrollado por el grupo MySQL en Oracle, también escrito íntegramente en Python. Su desempeño 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).

Benchmarks

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

ostrokach
fuente
2
Parece que PyMySQLsigue siendo el camino a seguir si se usa PyPy.
radtek
en caso de que tenga problemas con la compilación de mysqlclient, puede instalarlo a través del paquete de rueda como se describe aquí: stackoverflow.com/a/31077052/2848256
Искрен Станиславов
¿sqlalchemy admite mysqlclient?
vishal
4
@vishal AFAIK mysqlclientes el conector predeterminado que usa sqlalchemy cuando la URL de su base de datos comienza con mysql://.... Para usar PyMySQL, comience su URL con mysql+pymysql://.... Para usar mysql-connector-python, comience su URL con mysql+mysqlconnector://.... Consulte los documentos de sqlalchemy para obtener más información.
ostrokach
11

Muchas opciones proporcionadas por los usuarios. Un poco tarde para la fiesta. Pero mis dos centavos en la evaluación comparativa para la versión de pypy 3.7.

Apéguese a mysqlclient si desea un acceso más rápido y 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
Doogle
fuente