छोटा आनंद # 8: डेटाबेस के साथ काम करने के लिए क्षुद्र सुख

मेरे वर्तमान प्रोजेक्ट पर सहकर्मियों के एक त्वरित सर्वेक्षण से पता चला कि "अलकेमी" और "Django ORM" ध्वनि के अधिकांश मामलों में "ORM और डेटाबेस के साथ काम करना" शब्दों के साथ। इन दो शब्दों का ज्ञान, सामान्य रूप से, स्वच्छ, स्वच्छ और कामकाजी कोड लिखने के लिए पर्याप्त है। लेकिन इंजीनियरिंग क्षितिज का विस्तार करने से अब तक किसी को भी नुकसान नहीं पहुंचा है, इसलिए आज हम डेटाबेस के साथ काम करने के लिए दुनिया की हमारी तस्वीर को कुछ (शायद इस दिन अपरिचित तक) शांत टुकड़ों में जोड़ देंगे।



Yoyo


आज, कोई भी ORM आंतरिक डेटाबेस माइग्रेशन सिस्टम के साथ आता है। एक सरल और शांत दृष्टिकोण, जब ओआरएम सामान्य रूप से तालिकाओं की संरचना की निगरानी करता है, सभी को सूट करता है। लेकिन इस समाधान में एक मामला है जहां इसका उपयोग करना असुविधाजनक है:


  • ऐसे लोग हैं जो ORM को दरकिनार करते हुए एक डेटाबेस में अनुरोध करते हैं। यह अनुरोधों के संकलन को सरल बनाने के लिए asyncpg और एक छोटे से स्व-लिखित ब्लॉट जैसे कुछ का उपयोग करता है।


    ये लोग ORM सुविधाएं क्यों दे रहे हैं? हां, क्योंकि डेटाबेस के लिए कोई भी आवरण एक निश्चित मात्रा में सिस्टम संसाधनों को खाता है, और इन लोगों को उच्च-प्रदर्शन कोड लिखने की आवश्यकता होती है। उन्होंने ओआरएम को बाहर फेंक दिया, और किसी तरह उन्हें आधार को स्थानांतरित करने की आवश्यकता है।


  • अंतर्निहित प्रवासियों के रिकॉर्ड जोड़ने और अनुक्रमण पर उनके अपने विशिष्ट विचार हो सकते हैं। कभी-कभी तालिका संरचना पर इन ओआरएम विचारों को पराजित करना संभव नहीं होता है;

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


आउटपुट बुद्धिमानी से संकलित एक साफ, समझने योग्य और पूरी तरह से प्रबंधनीय तालिका संरचना है।


इस तरह के एक मैनुअल दृष्टिकोण के लिए, एक योयो डेटाबेस स्कीमा माइग्रेटर है।


pip install yoyo-migrations 

अगला, सभी माइग्रेशन प्रबंधन कार्य योयो निष्पादन योग्य का उपयोग करके किया जाता है


 yoyo new ./migrations -m "Add column to foo" 

कमांड एक फ़ाइल बनाता है जिसमें आप स्कीमा को माइग्रेट करने के लिए एक या अधिक निर्देश दर्ज कर सकते हैं


 from yoyo import step steps = [ step("CREATE TABLE foo (id INT, bar VARCHAR(20), PRIMARY KEY (id))", "DROP TABLE foo"), ] 

इस माइग्रेशन के बाद, आप आधार पर रोल कर सकते हैं


 yoyo apply --database postgresql://scott:tiger@localhost/db ./migrations 

सब कुछ सरल है, जैसे लॉग। और एक ही समय में आप डेटाबेस पर कैसे लग रहा है पर पूरी तरह से नियंत्रण है।


इस दृष्टिकोण के दो डाउनसाइड हैं।


  • तालिकाओं में फ़ील्ड के सेट और उनके मापदंडों को हैंडल द्वारा पालन करना होगा। प्रत्येक परिवर्तन से स्वयं को लिखने की आवश्यकता होती है, एक क्लिक में सब कुछ स्थानांतरित करने की क्षमता खो जाती है।
  • इस तरह के पलायन को कम करके हमेशा हाथों और सिर के साथ रहना होगा। यह, ज़ाहिर है, शानदार काम है। लेकिन व्यवहार में, संघर्ष और प्रवास के जटिल विलय दुर्लभ हैं।

Peewee


छवि


एक छोटा और सबसे लोकप्रिय ओआरएम (हालांकि यह एक से अधिक बार यहां के बारे में लिखा गया है), जो हालांकि, अपने स्वयं के दर्शक हैं।
Peewee को डेटाबेस के लिए सबसे बेवकूफ और सरल आवरण माना जाता है, जिसमें सबसे अधिक समझने योग्य क्वेरी निष्पादन तंत्र और कोड को पढ़ने में आसान है।


 Users.select().where( Users.user_id == user_id ).get() 

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


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

टट्टू orm


टट्टू एक पौराणिक आवरण है। इस ORM के उपयोग से लिखी गई डेटाबेस लेयर कई बार अन्य समाधानों की गति को तेज कर सकती है। इसकी गति में कोई जादू नहीं है, डेटाबेस के लिए कैशिंग अनुरोधों की एक बहुत ही सक्षम नीति है, कोड के साथ अनुकूलन और चाल की ढेर। कुल मिलाकर, यह इस तथ्य की ओर जाता है कि टट्टू घोड़े की गति से भूनता है।


इस ओआरएम में माइनस को क्वेरी सिंटैक्स कहा जा सकता है - यह बहुत विशिष्ट है, जनरेटर, लैम्ब्डा और अन्य पायथन भाषा बन्स का उपयोग करते हुए।


 query = select(c for c in Customer if sum(o.total_price for o in c.orders) > 1000) Product.select().order_by(lambda p: desc(sum(p.order_items.quantity))).first() 

इस दृष्टिकोण को मस्तिष्क के एक निश्चित टूटने की आवश्यकता होती है।


कछुआ ओरम



विभिन्न पालतू-मैत्रीपूर्ण रिपॉज में भाग लेते हुए, मुझे गति माप के साथ विभिन्न ओआरएम के परीक्षणों का एक संग्रह मिला। पहले से उल्लेख किए गए पोनी ओआरएम के अलावा, एक निश्चित कछुआ ओआरएम सबसे तेज की सूची में दिखाई दिया। यह स्पष्ट है कि परीक्षण के परिणाम इस बात पर निर्भर करते हैं कि परीक्षण कौन लिखता है और वे फिर कैसे चलते हैं, लेकिन आपको इस चीज को करीब से देखने की जरूरत है।


कछुआ एक अपेक्षाकृत युवा परियोजना है, जो अभी भी सक्रिय विकास के अधीन है। इस लाइब्रेरी के अच्छे प्रदर्शन को इस तथ्य से समझाया गया है कि ORM में कुछ भी अधिक नहीं होता है और यह एसिंक्रोनस ऑपरेशन के लिए कैद बॉक्स से बाहर होता है। और यह uvloop के उपयोग को भी मानता है, जो घटनाओं के देशी पिटियन चक्रों की तुलना में तेजी से काम करता है।


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

Source: https://habr.com/ru/post/hi460435/


All Articles