Sự khác biệt giữa MySQLdb, mysqlclient và MySQL connector / Python là gì?


91

Vì vậy, tôi đã cố gắng thực hiện một số cập nhật cơ sở dữ liệu với python và trong khi thiết lập toàn bộ môi trường dành cho nhà phát triển, tôi gặp ba điều này khiến tôi choáng váng.

  1. MySQLdb

  2. mysqlclient

  3. Và sau đó có một python trình kết nối mysql

Mỗi loại trong số chúng là gì, sự khác biệt và nơi sử dụng chúng? Cảm ơn


1
Hầu hết các ngôn ngữ đều có một số lớp bộ điều hợp cơ sở dữ liệu với các mức độ phức tạp, hỗ trợ và chất lượng khác nhau.
tadman

mysqlclient là một phiên bản MySQLdb được phân nhánh với hỗ trợ python3.3 + và trình kết nối mysql là mô-đun chính thức từ mysql.
warungman

3
Chúng tôi cũng đã pymysql
Cenk Alti

Câu trả lời:


77

MySQLdb là một trình bao bọc python mỏng xung quanh mô-đun C triển khai API cho cơ sở dữ liệu MySQL.

Đã có phiên bản trình bao bọc MySQLDb1 được sử dụng cách đây một thời gian và bây giờ nó được coi là di sản. Khi MySQLDb1 bắt đầu phát triển thành MySQLDb2 với các bản sửa lỗi và hỗ trợ Python3, MySQLDb1 đã được phân nhánh và đây là cách mysqlclient xuất hiện, với các bản sửa lỗi và hỗ trợ Python3. Tóm lại, bây giờ chúng ta có MySQLDb2 chưa sẵn sàng để sử dụng sản xuất, MySQLDb1 là trình điều khiển lỗi thời và cộng đồng hỗ trợ mysqlclient với các bản sửa lỗi và hỗ trợ Python3.

Bây giờ, để giải quyết mớ hỗn độn đó, MySQL cung cấp phiên bản bộ điều hợp MySQL của riêng họ - trình kết nối mysql , một mô-đun python tất cả trong sử dụng MySQL API không có phụ thuộc mô-đun C và chỉ sử dụng mô-đun python tiêu chuẩn.

Vì vậy, bây giờ câu hỏi đi xuống: trình kết nối mysqlclient vs mysql.

Đối với tôi, tôi sẽ sử dụng thư viện được hỗ trợ chính thức, tuy nhiên mysqlclientcũng nên là một lựa chọn tốt. Cả hai đều đang được cập nhật tích cực với các bản sửa lỗi và các tính năng mới mà bạn có thể thấy bằng các cam kết tích cực trong những ngày qua.

Lưu ý: Tôi không có nhiều kinh nghiệm với chúng, vì vậy có thể có trường hợp cái này hoặc cái khác không phù hợp với nhu cầu của bạn. Cả hai thư viện đều tuân theo tiêu chuẩn PEP-249 có nghĩa là bạn sẽ ổn với ít nhất chức năng cơ bản ở mọi nơi.

Cài đặt và phụ thuộc

  • mysqlclient

Là một nhánh của trình bao bọc C, nó yêu cầu mô-đun C hoạt động với MySQL, bổ sung các tệp tiêu đề python để xây dựng các phần mở rộng này (đọc python-dev). Việc cài đặt phụ thuộc vào hệ thống bạn sử dụng, chỉ cần đảm bảo rằng bạn biết tên gói và có thể cài đặt chúng.


66

Có các bộ điều hợp MySQL cho Python hiện đang được duy trì:

  • mysqlclient- Cho đến nay trình kết nối MySQL nhanh nhất cho CPython. Yêu cầu mysql-connector-cthư viện C hoạt động.

  • PyMySQL- Ứng dụng khách MySQL Python thuần túy. Theo nhà bảo trì của cả hai mysqlclientPyMySQL , bạn nên sử dụng PyMySQLnếu:

    • Bạn không thể sử dụng libmysqlclientvì một số lý do.
    • Bạn muốn sử dụng ổ cắm có khớp nối của gevent hoặc eventlet.
    • Bạn sẽ không thể hack giao thức mysql.
  • mysql-connector-python- MySQL connector do nhóm MySQL tại Oracle phát triển, cũng được viết hoàn toàn bằng Python. Hiệu suất của nó dường như là kém nhất trong số ba. Ngoài ra, do một số vấn đề cấp phép, bạn không thể tải xuống từ PyPI (nhưng hiện đã có sẵn thông qua conda).

Điểm chuẩn

Theo các tiêu chuẩn sau, mysqlclientnhanh hơn (đôi khi nhanh hơn 10 lần) so với các ứng dụng Python thuần túy.


2
Vì vậy, có vẻ như PyMySQLvẫn là con đường để đi nếu sử dụng PyPy.
radtek

trong trường hợp bạn có vấn đề với biên soạn mysqlclient bạn có thể cài đặt nó thông qua gói bánh như mô tả ở đây: stackoverflow.com/a/31077052/2848256
Искрен Станиславов

sqlalchemy có hỗ trợ mysqlclient không?
vishal

4
@vishal AFAIK mysqlclientlà trình kết nối mặc định được sqlalchemy sử dụng khi URL cơ sở dữ liệu của bạn bắt đầu bằng mysql://.... Để sử dụng PyMySQL, hãy bắt đầu URL của bạn bằng mysql+pymysql://.... Để sử dụng mysql-connector-python, hãy bắt đầu URL của bạn bằng mysql+mysqlconnector://.... Xem tài liệu sqlalchemy để biết thêm thông tin.
ostrokach

11

Rất nhiều tùy chọn được cung cấp bởi người dùng. Đi tiệc muộn một chút. Nhưng 2 xu của tôi với điểm chuẩn cho phiên bản pypy 3.7.

Hãy gắn bó với mysqlclient nếu bạn muốn truy cập nhanh hơn và truy cập lặp lại

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]

Vòng lặp ... từ điểm chuẩn trước đó ...

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.