¿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


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.