MySQLdb, mysqlclient ve MySQL bağlayıcısı / Python arasındaki fark nedir?


91

Bu yüzden python ile bazı veritabanı güncellemeleri yapmaya çalışıyordum ve tüm dev ortamını kurarken başımı döndüren bu üç şeye rastladım.

  1. Orada MySQLdb

  2. Orada mysqlclient

  3. Ve sonra bir mysql bağlayıcı python var

Her biri nedir, farkı ve nerede kullanılacağı? Teşekkürler


1
Çoğu dilde, farklı düzeylerde karmaşıklık, destek ve kalite içeren birkaç veritabanı bağdaştırıcı katmanı bulunur.
tadman

mysqlclient, python3.3 + destekli MySQLdb'nin çatallı bir sürümüdür ve mysql konektörü, mysql'nin resmi modülüdür.
warungman

3
Ayrıca pymysql
Cenk Altı

Yanıtlar:


77

MySQLdb , MySQL veritabanı için API uygulayan C modülü etrafında ince bir python sarmalayıcısıdır.

Bir süre önce kullanılan sarmalayıcının MySQLDb1 sürümü vardı ve şimdi bir miras olarak kabul ediliyor. MySQLDb1 , hata düzeltmeleri ve Python3 desteği ile MySQLDb2'ye dönüşmeye başladığında , bir MySQLDb1 çatallandı ve işte hata düzeltmeleri ve Python3 desteği ile mysqlclient nasıl ortaya çıktı. Özetle, artık üretimde kullanıma hazır olmayan MySQLDb2, eski bir sürücü olarak MySQLDb1 ve hata düzeltmeleri ve Python3 desteği ile topluluk tarafından desteklenen bir mysqlclient var.

Şimdi, bu karmaşayı çözmek için MySQL, MySQL bağdaştırıcısının kendi sürümünü sağlıyor - mysql konektörü , MySQL API kullanan ve C modülü bağımlılıkları olmadan ve yalnızca standart python modülleri kullanılan hepsi bir arada bir python modülü .

Şimdi soru şu şekilde geliyor: mysqlclient ve mysql konektörü.

Bana gelince, resmi olarak desteklenen kütüphaneyle giderdim, ancak mysqlclientaynı zamanda iyi bir seçim olmalı. Her ikisi de, son günlerde aktif kaydetmelerde görebileceğiniz düzeltmeler ve yeni özelliklerle aktif olarak güncelleniyor.

Not: Onlarla pek deneyimim olmadı, bu yüzden biri veya diğerinin ihtiyaçlarınızı karşılamadığı durumlar olabilir. Her iki kitaplık da PEP-249 standardını takip eder, bu da her yerde en azından temel işlevsellik konusunda iyi olmanız gerektiği anlamına gelir.

Kurulum ve Bağımlılıklar

  • mysqlclient

C sarmalayıcısının bir çatalı olarak, bu uzantıları oluşturmak için python başlık dosyaları ekleyen MySQL ile C modüllerinin çalışmasını gerektirir (python-dev okuyun). Kurulum kullandığınız sisteme bağlıdır, sadece paket adlarını bildiğinizden ve bunları kurabildiğinizden emin olun.


66

Şu anda bakımı yapılan Python için MySQL bağdaştırıcıları vardır:

  • mysqlclient- CPython için açık ara en hızlı MySQL bağlayıcısı. mysql-connector-cC kitaplığının çalışmasını gerektirir .

  • PyMySQL- Saf Python MySQL istemcisi. Her iki sürdürücü göre mysqlclientvePyMySQL , kullanmak gerekir PyMySQLeğer:

    • libmysqlclientNedense kullanamazsınız .
    • Gevent veya eventlet'in maymun eklenmiş soketini kullanmak istiyorsunuz.
    • MySQL protokolünü kırmak istemezsin.
  • mysql-connector-python- Oracle'daki MySQL grubu tarafından geliştirilen MySQL bağlayıcısı da tamamen Python ile yazılmıştır. Performans, üçünden en kötüsü gibi görünüyor. Ayrıca, bazı lisans sorunları nedeniyle, PyPI'den indiremezsiniz (ancak artık conda aracılığıyla kullanılabilir).

Kıyaslamalar

Aşağıdaki kıyaslamalara mysqlclientgöre, saf Python istemcilerinden daha hızlıdır (bazen> 10 kat daha hızlı).


2
Öyleyse PyMySQLPyPy kullanıyorsanız hala gitmenin yolu gibi görünüyor .
radtek

mysqlclient'i derlemede sorun yaşarsanız, burada açıklandığı gibi tekerlek paketi yoluyla yükleyebilirsiniz: stackoverflow.com/a/31077052/2848256
Искрен Станиславов

sqlalchemy mysqlclient'i destekliyor mu?
vishal

4
@vishal AFAIK mysqlclient, veritabanı URL'niz ile başladığında sqlalchemy tarafından kullanılan varsayılan bağlayıcıdır mysql://.... Kullanmak PyMySQLiçin URL'nizi ile başlatın mysql+pymysql://.... Kullanmak mysql-connector-pythoniçin URL'nizi ile başlatın mysql+mysqlconnector://.... Daha fazla bilgi için sqlalchemy belgelerine bakın .
ostrokach

11

Kullanıcılar tarafından sağlanan birçok seçenek. Partiye biraz geç. Ama benim 2 sentim, pypy 3.7 versiyonu için kıyaslamada.

Daha hızlı erişim ve tekrarlayan erişim istiyorsanız mysqlclient'e bağlı kalın

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]

Döngü ... önceki karşılaştırmadan ...

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.