Qual è la differenza tra MySQLdb, mysqlclient e MySQL connector / Python?


95

Quindi ho provato ad aggiornare il database con Python e durante la configurazione dell'intero ambiente di sviluppo, mi sono imbattuto in queste tre cose che mi hanno fatto girare la testa.

  1. C'è MySQLdb

  2. C'è mysqlclient

  3. E poi c'è un connettore mysql python

Qual è ciascuno di loro, la differenza e dove usarli? Grazie


1
La maggior parte delle lingue ha diversi livelli di adattatori per database con diversi livelli di sofisticazione, supporto e qualità.
tadman

mysqlclient è una versione biforcuta di MySQLdb con supporto python3.3 + e il connettore mysql è il modulo ufficiale di mysql.
warungman

3
Abbiamo anche pymysql
Cenk Alti

Risposte:


82

MySQLdb è un sottile wrapper Python attorno al modulo C che implementa l'API per il database MySQL.

C'era la versione MySQLDb1 del wrapper usata qualche tempo fa e ora è considerata un'eredità. Quando MySQLDb1 ha iniziato a evolversi in MySQLDb2 con correzioni di bug e supporto per Python3, è stato eseguito il fork di MySQLDb1 ed ecco come è apparso mysqlclient , con correzioni di bug e supporto Python3. Riassumendo, ora abbiamo MySQLDb2 che non è pronto per l'uso in produzione, MySQLDb1 come driver obsoleto e mysqlclient supportato dalla comunità con correzioni di bug e supporto Python3.

Ora, per risolvere questo pasticcio, MySQL fornisce la propria versione dell'adattatore MySQL: connettore mysql , un modulo Python all-in che utilizza l'API MySQL senza dipendenze di moduli C e solo moduli Python standard utilizzati.

Quindi ora la domanda si riduce a: mysqlclient vs mysql connector.

Per quanto mi riguarda, sceglierei una libreria ufficialmente supportata, tuttavia mysqlclientdovrebbe essere anche una buona scelta. Entrambi vengono aggiornati attivamente con correzioni e nuove funzionalità che puoi vedere dai commit attivi negli ultimi giorni.

Nota: non avevo molta esperienza con loro, quindi potrebbero esserci casi in cui l'uno o l'altro non soddisfa le tue esigenze. Entrambe le librerie seguono lo standard PEP-249 , il che significa che dovresti stare bene con almeno le funzionalità di base ovunque.

Installazione e dipendenze

  • mysqlclient

Come fork del wrapper C, richiede che i moduli C funzionino con MySQL che aggiunge file di intestazione python per creare queste estensioni (leggi python-dev). L'installazione dipende dal sistema che usi, assicurati solo di conoscere i nomi dei pacchetti e di poterli installare.


71

Ci sono tre adattatori MySQL per Python che sono attualmente mantenuti:

  • mysqlclient- Di gran lunga il connettore MySQL più veloce per CPython. Richiede la mysql-connector-clibreria C per funzionare.

  • PyMySQL- Python Python MySQL client. Secondo il manutentore di entrambi mysqlclientePyMySQL , dovresti usare PyMySQLse:

    • Non puoi usare libmysqlclientper qualche motivo.
    • Vuoi usare il socket con patch di scimmia di gevent o eventlet.
    • Non vuoi hackerare il protocollo mysql.
  • mysql-connector-python- Connettore MySQL sviluppato dal gruppo MySQL di Oracle, anch'esso scritto interamente in Python. La sua prestazione sembra essere la peggiore delle tre. Inoltre, a causa di alcuni problemi di licenza, non è possibile scaricarlo da PyPI (ma ora è disponibile tramite conda).

Punti di riferimenti

Secondo i seguenti benchmark, mysqlclientè più veloce (a volte> 10 volte più veloce) dei client Python puri.


2
Quindi sembra che PyMySQLsia ancora la strada da percorrere se si utilizza PyPy.
radtek

nel caso in cui si hanno problemi con la compilazione mysqlclient potete installarlo tramite pacco di ruota come descritto qui: stackoverflow.com/a/31077052/2848256
Искрен Станиславов

sqlalchemy supporta mysqlclient?
vishal

4
@vishal AFAIK mysqlclientè il connettore predefinito utilizzato da sqlalchemy quando l'URL del database inizia con mysql://.... Per utilizzarlo PyMySQL, inizia il tuo URL con mysql+pymysql://.... Per utilizzarlo mysql-connector-python, inizia il tuo URL con mysql+mysqlconnector://.... Vedere la documentazione di sqlalchemy per ulteriori informazioni.
ostrokach

12

Molte opzioni fornite dagli utenti. Un po 'tardi per la festa. Ma i miei 2 centesimi con il benchmarking per la versione 3.7 di Pypy.

Attenersi a mysqlclient se si desidera un accesso più rapido e ripetitivo

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]

Loop ... dal benchmark precedente ...

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.