Jaka jest różnica między MySQLdb, mysqlclient i łącznikiem MySQL / Pythonem?

91

Próbowałem więc zaktualizować bazę danych za pomocą Pythona i podczas konfigurowania całego środowiska deweloperskiego natknąłem się na te trzy rzeczy, które przyprawiły mnie o zawrót głowy.

  1. Jest MySQLdb

  2. Jest mysqlclient

  3. Jest też python łącznika mysql

Jaki jest każdy z nich, różnica i gdzie ich używać? Dzięki

आनंद
źródło
1
Większość języków ma kilka warstw adapterów bazy danych o różnym poziomie zaawansowania, obsługi i jakości.
tadman
mysqlclient to rozwidlona wersja MySQLdb z obsługą python3.3 +, a złącze mysql to oficjalny moduł mysql.
warungman
3
Mamy też pymysql
Cenk Alti

Odpowiedzi:

77

MySQLdb to cienkie opakowanie Pythona wokół modułu C, które implementuje API dla bazy danych MySQL.

Jakiś czas temu była używana wersja opakowania MySQLDb1, która obecnie jest uznawana za starszą . Gdy MySQLDb1 zaczął ewoluować do MySQLDb2 z poprawkami błędów i obsługą Python3, MySQLDb1 został rozwidlony i oto jak pojawił się mysqlclient , z poprawkami błędów i obsługą Python3. Podsumowując, mamy teraz MySQLDb2, który nie jest gotowy do użytku produkcyjnego, MySQLDb1 jako przestarzały sterownik i obsługiwanego przez społeczność mysqlclient z poprawkami błędów i obsługą Python3.

Teraz, aby rozwiązać ten bałagan, MySQL dostarcza własną wersję adaptera MySQL - łącznik mysql , wszechstronny moduł Pythona, który używa MySQL API bez zależności modułów C i używa tylko standardowych modułów Pythona.

Więc teraz pytanie sprowadza się do: mysqlclient vs mysql connector.

Jeśli chodzi o mnie, wybrałbym oficjalnie obsługiwaną bibliotekę, jednak również mysqlclientpowinien być dobrym wyborem. Oba są aktywnie aktualizowane o poprawki i nowe funkcje, które można zobaczyć dzięki aktywnym zatwierdzeniom w ostatnich dniach.

Uwaga: nie miałem z nimi dużego doświadczenia, więc mogą się zdarzyć sytuacje, w których jedna lub druga nie będzie odpowiadać Twoim potrzebom. Obie biblioteki są zgodne ze standardem PEP-249, co oznacza, że ​​powinieneś mieć przynajmniej podstawową funkcjonalność wszędzie.

Instalacja i zależności

  • mysqlclient

Jako rozwidlenie opakowania C wymaga modułów C do pracy z MySQL, który dodaje pliki nagłówkowe Pythona, aby zbudować te rozszerzenia (przeczytaj python-dev). Instalacja zależy od używanego systemu, po prostu upewnij się, że znasz nazwy pakietów i możesz je zainstalować.

Taras Matsyk
źródło
66

Istnieją trzy adaptery MySQL dla Pythona, które są obecnie obsługiwane:

  • mysqlclient- Zdecydowanie najszybsze złącze MySQL dla CPythona. Wymaga mysql-connector-cbiblioteki C.

  • PyMySQL- Czysty klient Python MySQL. Według opiekuna obu mysqlclientiPyMySQL , powinieneś użyć, PyMySQLjeśli:

    • Nie możesz użyć libmysqlclientz jakiegoś powodu.
    • Chcesz użyć monkeypatched gniazda gevent lub eventlet.
    • Nie chcesz włamać się do protokołu MySQL.
  • mysql-connector-python- Konektor MySQL opracowany przez grupę MySQL w Oracle, również napisany w całości w Pythonie. Jego wydajność wydaje się być najgorsza z całej trójki. Ponadto, z powodu pewnych problemów licencyjnych, nie można go pobrać z PyPI (ale jest teraz dostępny za pośrednictwem conda).

Benchmarki

Zgodnie z poniższymi testami porównawczymi mysqlclientjest szybszy (czasami> 10x szybciej) niż klienci czystego Pythona.

ostrokach
źródło
2
Wygląda na PyMySQLto, że nadal jest do zrobienia, jeśli używasz PyPy.
radtek
jeśli masz problemy z kompilacją mysqlclient, możesz zainstalować go za pomocą pakietu wheel, jak opisano tutaj: stackoverflow.com/a/31077052/2848256
Искрен Станиславов
czy sqlalchemy obsługuje mysqlclient?
vishal
4
@vishal AFAIK mysqlclientjest domyślnym łącznikiem używanym przez sqlalchemy, gdy adres URL bazy danych zaczyna się od mysql://.... Aby użyć PyMySQL, zacznij swój adres URL od mysql+pymysql://.... Aby użyć mysql-connector-python, zacznij swój adres URL od mysql+mysqlconnector://.... Więcej informacji można znaleźć w dokumentacji sqlalchemy .
ostrokach
11

Wiele opcji dostarczonych przez użytkowników. Trochę późno na imprezę. Ale moje 2 centy z benchmarkingiem dla wersji Pypy 3.7.

Trzymaj się mysqlclient, jeśli chcesz uzyskać szybszy i powtarzalny dostęp

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]

Pętla ... z poprzedniego testu porównawczego ...

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
źródło