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.