Web2py - डेटाबेस अमूर्त परत

Database Abstraction Layer (DAL)web2py की प्रमुख ताकत के रूप में माना जाता है। DAL अंतर्निहित SQL सिंटैक्स में एक साधारण अनुप्रयोग प्रोग्रामिंग इंटरफ़ेस (API) उजागर करता है।

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

DAL की कुछ महत्वपूर्ण विशेषताएं हैं -

  • web2py में एक डेटाबेस एब्स्ट्रक्शन लेयर (DAL), एक एपीआई शामिल है जो डेटाबेस ऑब्जेक्ट्स में पायथन ऑब्जेक्ट्स को मैप करता है। डेटाबेस ऑब्जेक्ट क्वेरी, टेबल और रिकॉर्ड हो सकते हैं।

  • DAL गतिशील रूप से डेटाबेस बैक एंड के लिए निर्दिष्ट बोली का उपयोग करके वास्तविक समय में SQL उत्पन्न करता है, ताकि किसी डेवलपर के लिए पूर्ण SQL क्वेरी लिखना अनिवार्य न हो।

  • डीएएल का उपयोग करने का मुख्य लाभ यह है कि आवेदन विभिन्न प्रकार के डेटाबेस के साथ पोर्टेबल होंगे।

डीएएल से शुरुआत करना

Web2py में अधिकांश अनुप्रयोगों के लिए डेटाबेस कनेक्शन की आवश्यकता होती है। इसलिए, डेटाबेस मॉडल का निर्माण एक एप्लिकेशन के डिजाइन में पहला कदम है।

नामित नए बनाए गए एप्लिकेशन पर विचार करें “helloWorld”। डेटाबेस अनुप्रयोग के मॉडल के तहत कार्यान्वित किया जाता है। संबंधित एप्लिकेशन के सभी मॉडल फ़ाइल नाम के तहत शामिल हैं -models/db_custom.py.

निम्नलिखित चरणों का उपयोग DAL को लागू करने के लिए किया जाता है -

चरण 1 - दाल निर्माता

डेटाबेस कनेक्शन स्थापित करें। यह DAL ऑब्जेक्ट का उपयोग करके बनाया गया है जिसे DAL कंस्ट्रक्टर भी कहा जाता है।

db = DAL ('sqlite://storage.sqlite')

डीएएल की उल्लेखनीय विशेषता यह है कि यह एक ही डेटाबेस या अलग-अलग डेटाबेस के साथ, यहां तक ​​कि विभिन्न प्रकार के डेटाबेस के साथ कई कनेक्शन की अनुमति देता है। यह देखा गया है कि यह लाइन पहले से ही फाइल में हैmodels/db.py। इसलिए, आपको इसकी आवश्यकता नहीं हो सकती है, जब तक कि आपने इसे हटा नहीं दिया है या किसी अलग डेटाबेस से कनेक्ट करने की आवश्यकता नहीं है। डिफ़ॉल्ट रूप से, web2py फ़ाइल में संग्रहीत SQLite डेटाबेस से जुड़ता हैstorage.sqlite

यह फ़ाइल एप्लिकेशन के डेटाबेस फ़ोल्डर में स्थित है। यदि फ़ाइल अनुपस्थित है, तो अनुप्रयोग द्वारा पहली बार निष्पादित किए जाने पर इसे web2py द्वारा बनाया जाता है।

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

SQLite के दो नुकसान हैं।

  • एक यह है कि यह कॉलम प्रकारों को लागू नहीं करता है, और कॉलम जोड़ने और छोड़ने के अलावा कोई अन्य तालिका नहीं है।

  • दूसरा नुकसान यह है कि पूरे डेटाबेस को किसी भी लेनदेन से बंद कर दिया जाता है जिसके लिए लिखने की आवश्यकता होती है।

चरण 2 - टेबल कंस्ट्रक्टर

एक बार डेटाबेस के साथ संबंध स्थापित हो जाने के बाद, हम इसका उपयोग कर सकते हैं define_table नई तालिकाओं को परिभाषित करने की विधि।

उदाहरण के लिए -

db.define_table('invoice',Field('name'))

उपरोक्त विधि का उपयोग तालिका निर्माता के बीच भी किया जाता है। टेबल कंस्ट्रक्टर के लिए सिंटैक्स समान है। पहला तर्क तालिका का नाम है, और इसके बाद की सूची हैField(s)। क्षेत्र निर्माता निम्नलिखित तर्क देता है -

अनु क्रमांक तर्क और उपयोग
1

The field name

तालिका में फ़ील्ड का नाम।

2

The field type

किसी भी डेटाटाइप जैसे स्ट्रिंग (डिफ़ॉल्ट), टेक्स्ट, बूलियन, पूर्णांक और इसी तरह के मान लेते हैं।

3

Length

अधिकतम लंबाई को परिभाषित करता है।

4

default = None

नया रिकॉर्ड सम्मिलित करने पर यह डिफ़ॉल्ट मान होता है।

5

update = None

यह डिफ़ॉल्ट के रूप में ही काम करता है, लेकिन मूल्य केवल अद्यतन पर उपयोग किया जाता है, सम्मिलित करने पर नहीं।

6

Notnull

यह निर्दिष्ट करता है कि फ़ील्ड मान NULL हो सकता है या नहीं।

7

readable = True

यह निर्दिष्ट करता है कि फ़ील्ड प्रपत्रों में पढ़ने योग्य है या नहीं।

8

writable = True

यह निर्दिष्ट करता है कि फ़ील्ड रूपों में उपयुक्त है या नहीं।

9

label = "Field Name"

यह प्रपत्रों में इस फ़ील्ड के लिए उपयोग किया जाने वाला लेबल है।

define_table विधि भी तीन नामित तर्क लेता है -

वाक्य - विन्यास

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - यह web2py को निर्देश देता है कि यदि यह मौजूद नहीं है, या यह मॉडल की परिभाषा से मेल नहीं खाता है, तो तालिका बनाएं।

  • fake_migrate = False - यदि मॉडल डेटाबेस तालिका की सामग्री से मेल खाता है, तो नकली_मिगेट सेट करें = यह सच है जो web2py को डेटा के पुनर्निर्माण में मदद करता है।

  • format = '%(id)s' - यह एक प्रारूप स्ट्रिंग है जो यह निर्धारित करती है कि दिए गए टेबल पर रिकॉर्ड कैसे दर्शाए जाने चाहिए।

कच्चे एसक्यूएल का निर्माण

डीएएल का उपयोग करके, हम डेटाबेस के लिए एक कनेक्शन स्थापित कर सकते हैं और टेबल कंस्ट्रक्टर और फील्ड कंस्ट्रक्टर का उपयोग करके नए टेबल और उनके क्षेत्र बना सकते हैं।

कभी-कभी, आवश्यक आउटपुट के अनुरूप SQL स्टेटमेंट जेनरेट करना आवश्यक होता है। web2py में विभिन्न कार्य शामिल हैं, जो कच्ची SQL बनाने में मदद करते हैं, जो निम्नानुसार हैं -

_insert

यह दी गई तालिका के लिए स्टेटमेंट डालने में मदद करता है। उदाहरण के लिए,

print db.person._insert(name ='ABC')

यह "व्यक्ति" नाम की तालिका के लिए सम्मिलित विवरण प्राप्त करेगा।

एसक्यूएल स्टेटमेंट आउटपुट -

INSERT INTO person(name) VALUES ('ABC');

_count

यह एसक्यूएल स्टेटमेंट प्राप्त करने में मदद करता है, जो रिकॉर्ड की गिनती देता है। उदाहरण के लिए, 'व्यक्ति' नाम की एक तालिका पर विचार करें और हमें 'एबीसी' नाम वाले व्यक्तियों की गिनती खोजने की आवश्यकता है।

print db(db.person.name ==' ABC ')._count()

एसक्यूएल स्टेटमेंट आउटपुट -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_चुनते हैं

यह एसक्यूएल स्टेटमेंट चुनने में मदद करता है। उदाहरण के लिए, 'व्यक्ति' नाम की एक तालिका पर विचार करें और हमें 'एबीसी' नाम वाले व्यक्तियों की सूची खोजने की आवश्यकता है।

print db(db.person.name == ' ABC ')._select()

एसक्यूएल स्टेटमेंट आउटपुट -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_delete

यह लाने में मदद करता है delete SQLबयान। उदाहरण के लिए, 'व्यक्ति' नाम की तालिका पर विचार करें और हमें 'एबीसी' नाम वाले कथनों को हटाना होगा।

print db(db.person.name == ' ABC ')._delete()

एसक्यूएल स्टेटमेंट आउटपुट -

DELETE FROM person WHERE person.name = ' ABC ';4

_अपडेट करें

यह अपडेट किए गए SQL स्टेटमेंट को लाने में मदद करता है। उदाहरण के लिए, 'व्यक्ति' नाम की तालिका पर विचार करें और हमें कुछ अन्य मान के साथ एक कॉलम नाम को अपडेट करने की आवश्यकता है।

print db(db.person.name == ' ABC ')._update()

एसक्यूएल स्टेटमेंट आउटपुट -

UPDATE person SET WHERE person.name = ’Alex’;

DAL (गोच) के साथ समस्याएँ

SQLite

SQLite में कॉलम को छोड़ने या बदलने के समर्थन का अभाव है। तालिका से किसी फ़ील्ड को हटाने से यह डेटाबेस में सक्रिय रहता है, जिसके कारण web2py को किए गए परिवर्तनों के बारे में पता नहीं होगा।

इस मामले में, इसे सेट करना आवश्यक है fake_migrate = True जो मेटाडेटा को फिर से परिभाषित करने में मदद करेगा जैसे कि कोई परिवर्तन जैसे कि परिवर्तन या हटाना web2py के ज्ञान के तहत रखा जाएगा।

SQLite बूलियन प्रकारों का समर्थन नहीं करता है। इसके लिए, web2py आंतरिक रूप से बुलियन को 1 वर्ण स्ट्रिंग में मैप करता है, जिसमें 'T' और 'F' प्रतिनिधित्व करते हैंtrue तथा False क्रमशः।

माई एसक्यूएल

MySQL ALTER TABLE सुविधा का समर्थन नहीं करता है। इस प्रकार, डेटाबेस के प्रवास में कई आवागमन शामिल हैं। पैरामीटर सेट करके इस स्थिति से बचा जा सकता हैfake_migrate = True डेटाबेस को परिभाषित करते समय, जो सभी मेटाडेटा को बनाए रखेगा।

आकाशवाणी

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