python MySQLdb, mysqlclient और MySQL कनेक्टर/पायथन में क्या अंतर है?




database mysql-python (3)

MySQLdb C मॉड्यूल के आसपास एक पतला अजगर रैपर है जो MySQL डेटाबेस के लिए API को लागू करता है।

कुछ समय पहले इस्तेमाल किया गया रैपर का MySQLDb1 संस्करण था और अब इसे एक विरासत माना जाता है। MySQLDb1 बग फिक्स और Python3 समर्थन के साथ MySQLDb2 लिए विकसित करना शुरू कर दिया है, एक MySQLDb1 को कांटा गया था और यहाँ कैसे mysqlclient दिखाई दिया है, बगफिक्स और पायथन 3 समर्थन के साथ। ऊपर उठो, तो अब हमारे पास MySQLDb2 है जो उत्पादन उपयोग के लिए तैयार नहीं है, एक पुराने ड्राइवर के रूप में MySQLDb1 और एक समुदाय ने बग फिक्स और पायथन 3 समर्थन के साथ mysqlclient का समर्थन किया।

अब, उस गंदगी को हल करने के लिए, MySQL MySQL एडॉप्टर - mysql कनेक्टर , एक ऑल-इन पायथन मॉड्यूल का अपना संस्करण प्रदान करता है जो MySQL API का उपयोग करता है जिसमें कोई C मॉड्यूल निर्भरता नहीं है और केवल मानक python मॉड्यूल का उपयोग किया जाता है।

तो अब सवाल नीचे आता है: mysqlclient बनाम mysql कनेक्टर।

मेरे लिए, मैं आधिकारिक तौर पर समर्थित पुस्तकालय के साथ जाऊंगा, हालांकि mysqlclient एक अच्छा विकल्प होना चाहिए। दोनों को सक्रिय रूप से फिक्स और नए फीचर्स के साथ अपडेट किया जा रहा है जिसे आप अंतिम दिनों में सक्रिय कमिट द्वारा देख सकते हैं।

नोट: मुझे उनके साथ बहुत अनुभव नहीं था, इसलिए ऐसे मामले हो सकते हैं जब एक या दूसरे आपकी आवश्यकताओं के अनुरूप नहीं होते हैं। दोनों पुस्तकालय PEP-249 मानक का पालन करते हैं जिसका मतलब है कि आपको हर जगह कम से कम आधार कार्यक्षमता के साथ ठीक होना चाहिए।

स्थापना और निर्भरता

  • mysqlclient

C रैपर के कांटे के रूप में इसे MySQL के साथ काम करने के लिए C मॉड्यूल की आवश्यकता होती है जो इन एक्सटेंशन को बनाने के लिए अजगर हेडर फाइल जोड़ता है (पायथन-देव पढ़ें)। स्थापना आपके द्वारा उपयोग किए जाने वाले सिस्टम पर निर्भर करती है, बस यह सुनिश्चित करें कि आप पैकेज नामों से अवगत हैं और उन्हें स्थापित कर सकते हैं।

इसलिए मैं अजगर के साथ कुछ डेटाबेस अपडेट करने की कोशिश कर रहा हूं और पूरे देव वातावरण की स्थापना करते हुए, मैं इन तीन चीजों में आया हूं जिससे मुझे चक्कर आया।

  1. वहाँ MySQLdb

  2. वहाँ mysqlclient

  3. और फिर एक mysql कनेक्टर अजगर है

उनमें से प्रत्येक क्या है, अंतर और उन्हें कहां उपयोग करना है? धन्यवाद


अजगर के लिए आप MySQL एडेप्टर हैं जो वर्तमान में बनाए हुए हैं:

  • mysqlclient - CPython के लिए अब तक का सबसे तेज MySQL कनेक्टर है। काम करने के लिए mysql-connector-c C लाइब्रेरी की आवश्यकता है।

  • PyMySQL - प्योर पायथन MySQL क्लाइंट। PyMySQL और PyMySQL दोनों के अनुरक्षक के अनुसार , आपको PyMySQL उपयोग करना चाहिए यदि:

    • आप किसी कारण के लिए libmysqlclient उपयोग नहीं कर सकते।
    • आप जियोवेंट या इवेंटलेट के मंकीपैक सॉकेट का उपयोग करना चाहते हैं।
    • आप mysql प्रोटोकॉल को हैक करना नहीं चाहेंगे।
  • mysql-connector-python - ओरेकल में MySQL समूह द्वारा विकसित MySQL कनेक्टर, पूरी तरह से पायथन में भी लिखा गया है। यह प्रदर्शन तीनों में से सबसे खराब प्रतीत होता है। इसके अलावा, कुछ लाइसेंस मुद्दों के कारण, आप इसे PyPI से डाउनलोड नहीं कर सकते हैं (लेकिन अब यह कोंडा के माध्यम से उपलब्ध है)।

मानक

निम्नलिखित बेंचमार्क के अनुसार, शुद्ध अजगर ग्राहकों की तुलना में mysqlclient तेज (कभी-कभी> 10x तेज) है।


उपयोगकर्ताओं द्वारा प्रदान किए गए बहुत सारे विकल्प। पार्टी करने के लिए थोड़ा लेट। लेकिन मेरे 2 सेंट pypy 3.7 संस्करण के लिए बेंचमार्किंग पर है।

यदि आप तेज़ पहुँच और दोहराव की पहुँच चाहते हैं तो 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






mysql-connector