그래서 저는 파이썬으로 데이터베이스 업데이트를 시도 해왔고 전체 개발 환경을 설정하는 동안 저를 어지럽게 만드는이 세 가지를 발견했습니다.
-
거기 MySQLdb는
-
있다 mysqlclient은
- 그리고 mysql 커넥터 파이썬이 있습니다.
각각은 무엇이고, 차이점은 무엇이며 어디에 사용합니까? 감사
답변
MySQLdb 는 MySQL 데이터베이스 용 API를 구현하는 C 모듈 주변의 얇은 파이썬 래퍼입니다.
얼마 전에 사용 된 MySQLDb1 버전의 래퍼 가 있었으며 이제는 레거시로 간주됩니다. MySQLDb1 이 버그 수정 및 Python3 지원을 통해 MySQLDb2로 진화하기 시작함에 따라 MySQLDb1 이 분기되었으며 다음은 버그 수정 및 Python3 지원과 함께 mysqlclient가 나타나는 방식 입니다. 요약하면 이제 프로덕션 용으로 준비되지 않은 MySQLDb2, 오래된 드라이버 인 MySQLDb1, 버그 수정 및 Python3 지원을 통해 mysqlclient를 지원하는 커뮤니티가 있습니다.
이제이 문제를 해결하기 위해 MySQL은 자체 버전의 MySQL 어댑터 인 mysql connector를 제공합니다 . 이는 C 모듈 종속성 이 없고 표준 Python 모듈 만 사용되는 MySQL API를 사용하는 올인 Python 모듈입니다 .
이제 질문은 mysqlclient 대 mysql 커넥터입니다.
저에게는 공식적으로 지원되는 라이브러리를 사용하지만 mysqlclient
좋은 선택이어야합니다. 둘 다 지난 며칠 동안 활성 커밋에서 볼 수있는 수정 및 새로운 기능으로 적극적으로 업데이트되고 있습니다.
참고 : 나는 그들에 대한 경험이 많지 않았으므로 둘 중 하나가 귀하의 요구에 맞지 않는 경우가있을 수 있습니다. 두 라이브러리 모두 PEP-249 표준을 따르 므로 모든 곳에서 최소한 기본 기능을 사용할 수 있습니다.
설치 및 종속성
- mysqlclient
C 래퍼의 포크로서, 이러한 확장을 빌드하기 위해 파이썬 헤더 파일을 추가하는 MySQL과 함께 작동하는 C 모듈이 필요합니다 (python-dev 읽기). 설치는 사용하는 시스템에 따라 다르므로 패키지 이름을 알고 있고 설치할 수 있는지 확인하십시오.
- mysql 커넥터
주요 문서 는 매우 명확하지만 Protobuf C ++ 종속성을 알고 있어야합니다 (mysql 커넥터 버전> = 2.2.3 ).
답변
현재 유지 관리되는 Python 용 MySQL 어댑터가 있습니다.
-
mysqlclient
-CPython을위한 가장 빠른 MySQL 커넥터입니다.mysql-connector-c
작동 하려면 C 라이브러리가 필요합니다 . -
PyMySQL
-순수 Python MySQL 클라이언트. 및 의 관리자에 따르면 다음mysqlclient
과 같은PyMySQL
PyMySQL
경우 사용해야 합니다.libmysqlclient
어떤 이유로 사용할 수 없습니다 .- gevent 또는 eventlet의 monkeypatched 소켓을 사용하고 싶습니다.
- mysql 프로토콜을 해킹하고 싶지 않습니다.
-
mysql-connector-python
-Oracle의 MySQL 그룹에서 개발 한 MySQL 커넥터이며 전적으로 Python으로 작성되었습니다. 성능은 세 가지 중 최악 인 것 같습니다. 또한 일부 라이선스 문제로 인해 PyPI에서 다운로드 할 수 없습니다 (이제 conda를 통해 사용할 수 있음).
벤치 마크
다음 벤치 마크에 mysqlclient
따르면는 순수 Python 클라이언트보다 빠릅니다 (때로는 10 배 이상 빠름).
답변
사용자가 제공하는 많은 옵션. 파티에 조금 늦었 어. 그러나 pypy 3.7 버전에 대한 벤치마킹으로 2 센트 가 있습니다.
더 빠른 액세스와 반복적 인 액세스를 원한다면 mysqlclient를 고수하십시오.
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]
루프 … 이전 벤치마킹에서 …
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