Apa perbedaan antara MySQLdb, mysqlclient dan konektor MySQL / Python?

91

Jadi saya telah mencoba melakukan beberapa pembaruan basis data dengan python dan saat menyiapkan seluruh lingkungan pengembang, saya menemukan tiga hal ini yang membuat saya pusing.

  1. Ada MySQLdb

  2. Ada klien saya

  3. Dan kemudian ada python konektor mysql

Apa masing-masing, perbedaan dan di mana menggunakannya? Terima kasih

आनंद
sumber
1
Kebanyakan bahasa memiliki beberapa lapisan adaptor database dengan berbagai tingkat kecanggihan, dukungan, dan kualitas.
tadman
mysqlclient adalah versi MySQLdb bercabang dengan dukungan python3.3 +, dan konektor mysql adalah modul resmi dari mysql.
warungman
3
Kami juga memiliki pymysql
Cenk Alti

Jawaban:

77

MySQLdb adalah pembungkus python tipis di sekitar modul C yang mengimplementasikan API untuk database MySQL.

Ada versi pembungkus MySQLDb1 yang digunakan beberapa waktu lalu dan sekarang dianggap sebagai warisan. Ketika MySQLDb1 mulai berevolusi ke MySQLDb2 dengan perbaikan bug dan dukungan Python3, MySQLDb1 telah bercabang dan berikut adalah bagaimana mysqlclient muncul, dengan perbaikan bug dan dukungan Python3. Singkatnya, jadi sekarang kita memiliki MySQLDb2 yang belum siap untuk digunakan produksi, MySQLDb1 sebagai driver yang ketinggalan jaman dan komunitas mendukung mysqlclient dengan perbaikan bug dan dukungan Python3.

Sekarang, untuk mengatasi kekacauan itu, MySQL menyediakan versi adaptor MySQL mereka sendiri - konektor mysql , modul python all-in yang menggunakan MySQL API tanpa dependensi modul C dan hanya modul python standar yang digunakan.

Jadi sekarang pertanyaannya adalah: konektor mysqlclient vs mysql.

Sedangkan untuk saya, saya akan pergi dengan perpustakaan yang didukung secara resmi, namun mysqlclientharus menjadi pilihan yang baik juga. Keduanya sedang diperbarui secara aktif dengan perbaikan dan fitur baru yang dapat Anda lihat dengan melakukan aktif di hari-hari terakhir.

Catatan: Saya tidak memiliki banyak pengalaman dengan mereka, jadi mungkin ada kasus ketika satu atau lainnya tidak sesuai dengan kebutuhan Anda. Kedua pustaka mengikuti standar PEP-249 yang berarti Anda akan baik-baik saja dengan setidaknya fungsionalitas dasar di mana-mana.

Instalasi dan Dependensi

  • mysqlclient.dll

Sebagai garpu pembungkus C, diperlukan modul C untuk bekerja dengan MySQL yang menambahkan file header python untuk membangun ekstensi ini (baca python-dev). Instalasi tergantung pada sistem yang Anda gunakan, pastikan Anda mengetahui nama paket dan dapat menginstalnya.

Taras Matsyk
sumber
66

Ada adaptor MySQL untuk Python yang saat ini dipertahankan:

  • mysqlclient- Sejauh ini konektor MySQL tercepat untuk CPython. Membutuhkan mysql-connector-cperpustakaan C untuk bekerja.

  • PyMySQL- Klien Python MySQL murni. Menurut pengelola keduanya mysqlclientdanPyMySQL , Anda harus menggunakan PyMySQLjika:

    • Anda tidak dapat menggunakan libmysqlclientkarena alasan tertentu.
    • Anda ingin menggunakan soket gevent atau eventlet berpasangan ganda.
    • Anda tidak ingin meretas protokol mysql.
  • mysql-connector-python- Konektor MySQL yang dikembangkan oleh grup MySQL di Oracle, juga seluruhnya ditulis dengan Python. Kinerjanya tampaknya yang terburuk dari ketiganya. Selain itu, karena beberapa masalah perizinan, Anda tidak dapat mengunduhnya dari PyPI (tetapi sekarang tersedia melalui conda).

Tolak ukur

Menurut tolok ukur berikut, mysqlclientlebih cepat (terkadang> 10x lebih cepat) daripada klien Python murni.

ostrokach.dll
sumber
2
Jadi sepertinya PyMySQLmasih cara yang harus ditempuh jika menggunakan PyPy.
radtek
jika Anda memiliki masalah dengan kompilasi mysqlclient Anda dapat menginstalnya melalui paket roda seperti yang dijelaskan di sini: stackoverflow.com/a/31077052/2848256
Искрен Станиславов
apakah sqlalchemy mendukung mysqlclient?
vishal
4
@vishal AFAIK mysqlclientadalah konektor default yang digunakan oleh sqlalchemy ketika URL database Anda dimulai dengan mysql://.... Untuk menggunakan PyMySQL, mulai URL Anda dengan mysql+pymysql://.... Untuk menggunakan mysql-connector-python, mulai URL Anda dengan mysql+mysqlconnector://.... Lihat dokumen sqlalchemy untuk info lebih lanjut.
ostrokach
11

Banyak sekali opsi yang disediakan oleh pengguna. Sedikit terlambat ke pesta. Tapi saya 2 sen di atas dengan benchmarking untuk versi pypy 3.7.

Tetap gunakan mysqlclient jika Anda ingin akses yang lebih cepat dan akses berulang

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]

Ulangi ... dari tolok ukur sebelumnya ...

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
sumber