[python] MySQLdb, mysqlclient 및 MySQL 커넥터 / Python의 차이점은 무엇입니까?

그래서 저는 파이썬으로 데이터베이스 업데이트를 시도 해왔고 전체 개발 환경을 설정하는 동안 저를 어지럽게 만드는이 세 가지를 발견했습니다.

  1. 거기 MySQLdb는

  2. 있다 mysqlclient은

  3. 그리고 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 읽기). 설치는 사용하는 시스템에 따라 다르므로 패키지 이름을 알고 있고 설치할 수 있는지 확인하십시오.


답변

현재 유지 관리되는 Python 용 MySQL 어댑터가 있습니다.

  • mysqlclient-CPython을위한 가장 빠른 MySQL 커넥터입니다. mysql-connector-c작동 하려면 C 라이브러리가 필요합니다 .

  • PyMySQL-순수 Python MySQL 클라이언트. 의 관리자에 따르면 다음 mysqlclient과 같은PyMySQLPyMySQL 경우 사용해야 합니다.

    • 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


답변