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.
Jest MySQLdb
Jest mysqlclient
- Jest też python łącznika mysql
Jaki jest każdy z nich, różnica i gdzie ich używać? Dzięki
Odpowiedzi:
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ż
mysqlclient
powinien 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
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ć.
źródło
Istnieją trzy adaptery MySQL dla Pythona, które są obecnie obsługiwane:
mysqlclient
- Zdecydowanie najszybsze złącze MySQL dla CPythona. Wymagamysql-connector-c
biblioteki C.PyMySQL
- Czysty klient Python MySQL. Według opiekuna obumysqlclient
iPyMySQL
, powinieneś użyć,PyMySQL
jeśli:libmysqlclient
z jakiegoś powodu.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
mysqlclient
jest szybszy (czasami> 10x szybciej) niż klienci czystego Pythona.źródło
PyMySQL
to, że nadal jest do zrobienia, jeśli używasz PyPy.mysqlclient
jest domyślnym łącznikiem używanym przez sqlalchemy, gdy adres URL bazy danych zaczyna się odmysql://...
. Aby użyćPyMySQL
, zacznij swój adres URL odmysql+pymysql://...
. Aby użyćmysql-connector-python
, zacznij swój adres URL odmysql+mysqlconnector://...
. Więcej informacji można znaleźć w dokumentacji sqlalchemy .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
źródło