Qual é a diferença entre MySQLdb, mysqlclient e conector MySQL / Python?

94

Tenho tentado fazer algumas atualizações de banco de dados com python e, ao configurar todo o ambiente de desenvolvimento, me deparei com essas três coisas que me deixaram tonto.

  1. Existe MySQLdb

  2. Existe mysqlclient

  3. E então há um python do conector mysql

Qual é cada um deles, a diferença e onde usá-los? obrigado

आनंद
fonte
1
A maioria das linguagens tem várias camadas de adaptadores de banco de dados com vários níveis de sofisticação, suporte e qualidade.
tadman
mysqlclient é uma versão bifurcada do MySQLdb com suporte a python3.3 + e o conector mysql é o módulo oficial do mysql.
Warungman
3
Temos também pymysql
Cenk Alti

Respostas:

82

MySQLdb é um wrapper fino de python em torno do módulo C que implementa API para banco de dados MySQL.

Houve MySQLDb1 versão de fardos usados há algum tempo e agora ele é considerado como um legado. Como MySQLDb1 começou a evoluir para MySQLDb2 com correções de bugs e suporte a Python3, um MySQLDb1 foi bifurcado e aqui está como mysqlclient apareceu, com correções de bugs e suporte a Python3. Resumindo, agora temos MySQLDb2 que não está pronto para uso em produção, MySQLDb1 como um driver desatualizado e um mysqlclient suportado pela comunidade com correções de bugs e suporte Python3.

Agora, para resolver essa bagunça, o MySQL fornece sua própria versão do adaptador MySQL - conector mysql , um módulo python completo que usa a API MySQL sem dependências de módulos C e apenas módulos python padrão usados.

Portanto, agora a questão se resume a: mysqlclient vs mysql connector.

Quanto a mim, eu escolheria uma biblioteca com suporte oficial, mas também mysqlclientdeve ser uma boa escolha. Ambos estão sendo ativamente atualizados com correções e novos recursos que você pode ver por commits ativos nos últimos dias.

Nota: Eu não tinha muita experiência com eles, então pode haver casos em que um ou outro não atenda às suas necessidades. Ambas as bibliotecas seguem o padrão PEP-249, o que significa que você deve estar bem com pelo menos a funcionalidade básica em todos os lugares.

Instalação e Dependências

  • mysqlclient

Como um fork do wrapper C, ele requer módulos C para trabalhar com MySQL, que adiciona arquivos de cabeçalho python para construir essas extensões (leia python-dev). A instalação depende do sistema que você usa, apenas certifique-se de conhecer os nomes dos pacotes e de poder instalá-los.

Taras Matsyk
fonte
71

Existem três adaptadores MySQL para Python que são mantidos atualmente:

  • mysqlclient- De longe o conector MySQL mais rápido para CPython. Requer a mysql-connector-cbiblioteca C para funcionar.

  • PyMySQL- Cliente Python MySQL puro. De acordo com o mantenedor de ambos mysqlclientePyMySQL , você deve usar PyMySQLse:

    • Você não pode usar libmysqlclientpor algum motivo.
    • Você deseja usar o socket monkeypatched de gevent ou eventlet.
    • Você não quer hackear o protocolo mysql.
  • mysql-connector-python- Conector MySQL desenvolvido pelo grupo MySQL da Oracle, também escrito inteiramente em Python. Seu desempenho parece ser o pior dos três. Além disso, devido a alguns problemas de licenciamento, você não pode baixá-lo do PyPI (mas agora está disponível através do conda).

Benchmarks

De acordo com os seguintes benchmarks, mysqlclienté mais rápido (às vezes> 10x mais rápido) do que os clientes Python puros.

ostrokach
fonte
2
Portanto, parece que PyMySQLainda é o caminho a percorrer se usar o PyPy.
radtek
caso você tenha problemas com a compilação do mysqlclient, você pode instalá-lo através do pacote wheel conforme descrito aqui: stackoverflow.com/a/31077052/2848256
Искрен Станиславов
o sqlalchemy suporta mysqlclient?
vishal
4
@vishal AFAIK mysqlclienté o conector padrão usado pelo sqlalchemy quando o URL do seu banco de dados começa com mysql://.... Para usar PyMySQL, comece seu URL com mysql+pymysql://.... Para usar mysql-connector-python, comece seu URL com mysql+mysqlconnector://.... Veja a documentação do sqlalchemy para mais informações.
ostrokach
12

Muitas opções fornecidas pelos usuários. Um pouco tarde para a festa. Mas meus 2 centavos de dólar em comparação com a versão 3.7 do pypy

Use mysqlclient se quiser um acesso mais rápido e 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]

Loop ... do benchmarking 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
fonte