ऐपमास्टर डेटाबेस के साथ काम करने के लिए व्यापक क्षमताएं प्रदान करता है। उदाहरण के लिए, खोज ब्लॉक का उपयोग करके, आप आवश्यक डेटा पा सकते हैं, संबंधित तालिकाएँ संलग्न कर सकते हैं, इसे सही क्रम में क्रमबद्ध कर सकते हैं, आदि। हालाँकि, कुछ स्थितियों में, यह पर्याप्त नहीं हो सकता है, और फिर SQL Exec ब्लॉक आता है बचाव। यह आपको SQL की पूरी शक्ति का उपयोग करके किसी भी डेटाबेस क्वेरी को चलाने की अनुमति देता है।
आइए एक डेटाबेस के उदाहरण का उपयोग करके ब्लॉक के संचालन पर विचार करें जिसमें पुस्तकों की एक सूची शामिल है।
आइए थोड़ी तैयारी करें। एक व्यावसायिक प्रक्रिया बनाना आवश्यक है, जो अपने सरलतम रूप में, अनुरोध भेजने के साथ-साथ उनके परिणाम भी प्राप्त करने की अनुमति दे।
आपको एक समापन बिंदु भी बनाना होगा जो आपको इस व्यवसाय प्रक्रिया तक पहुंचने की अनुमति देगा।
प्रारंभिक चरण में, यह पर्याप्त होना चाहिए। आप अपना आवेदन प्रकाशित कर सकते हैं और परीक्षण के लिए आगे बढ़ सकते हैं। इसके लिए स्वैगर का उपयोग करना बहुत सुविधाजनक है, जो प्रकाशन के समय स्वचालित रूप से बन जाता है।
हम एक सरल क्वेरी का उपयोग करते हैं जिसे डेटाबेस से सभी पुस्तकों का अनुरोध करना चाहिए।
सार्वजनिक.पुस्तक से * चुनें
कृपया ध्यान दें कि तालिका में (डेटाबेस संपादक में बनाई गई अन्य सभी तालिकाओं की तरह) स्कीमा को इंगित करने वाला एक उपसर्ग है - सार्वजनिक।
आप सत्यापित कर सकते हैं कि अनुरोध सफलतापूर्वक पूरा हुआ और परिणाम प्राप्त हुआ।
लेकिन समस्या यह है कि उत्तर को इस रूप में समझना बहुत कठिन है। एक संभावित समाधान अनुरोध को थोड़ा संशोधित करना और उसमें केवल आवश्यक फ़ील्ड छोड़ना है - उदाहरण के लिए, पुस्तक का शीर्षक और पृष्ठों की संख्या। इसके अलावा, एक सीमा निर्धारित करना उचित होगा, डेटाबेस से सभी पुस्तकों का अनुरोध न करें, बल्कि स्वयं को दस तक सीमित रखें।
public.book LIMIT 10 से नाम, पेज चुनें
बहुत बेहतर, लेकिन फिर भी वास्तविक उपयोग के लिए उपयुक्त नहीं है। आख़िरकार, एक व्यावसायिक प्रक्रिया में, आपको न केवल एक अनुरोध प्राप्त करने की आवश्यकता होती है, बल्कि उसके परिणाम के साथ कुछ करने की भी आवश्यकता होती है। इसके लिए, परिणाम को पाठ्य रूप में रखना ही पर्याप्त नहीं है; आपको इसे आगे के उपयोग के लिए उपयुक्त मॉडल में बदलने की आवश्यकता है।
ऐसा करने के लिए, आइए व्यवसाय प्रक्रिया पर वापस जाएं और इसे थोड़ा परिष्कृत करें। अंतिम ब्लॉक में, हम एक नया वेरिएबल जोड़ेंगे - पुस्तक मॉडल की एक सरणी।
आपको एक ब्लॉक की भी आवश्यकता होगी जो अनुरोध के परिणामस्वरूप प्राप्त JSON को एक मॉडल में बदल देगा। JSON को मॉडल में क्रमबद्ध करें।
आइए पिछले अनुरोध को दोहराएं और सुनिश्चित करें कि परिणाम दृश्य धारणा और बीपी में आगे के उपयोग दोनों के लिए अधिक उपयुक्त हो गया है।
अब, हम अधिक जटिल तर्क की ओर आगे बढ़ सकते हैं। आइए एक व्यवसाय प्रक्रिया बनाएं जो:
- इनपुट के रूप में पुस्तक का शीर्षक प्राप्त होता है।
- यह निर्धारित करता है कि यह किस श्रेणी (शैली) से संबंधित है।
- परिणामस्वरूप एक ही श्रेणी से 3 यादृच्छिक पुस्तकें लौटाता है (इस मामले में, अनुरोध की पुस्तक उनमें से नहीं होनी चाहिए)
ऐसा करने के लिए, हम एक नई व्यावसायिक प्रक्रिया बनाएंगे जो मानक ब्लॉकों का उपयोग करके खोज और SQL क्वेरीज़ के उपयोग को जोड़ती है।
पहला ब्लॉक किसी पुस्तक को उसके शीर्षक से ढूंढना है, और यह भी निर्धारित करना है कि वह किस श्रेणी से संबंधित है। ऐसा करने के लिए, हम निम्नलिखित मापदंडों के साथ खोज ब्लॉक का उपयोग करते हैं:
- _साथ = श्रेणियाँ - पुस्तक के अलावा, क्वेरी परिणाम के लिए संबंधित श्रेणी तालिका से जानकारी की आवश्यकता होती है।
- _सीमा = 1 - केवल एक पुस्तक ढूंढनी होगी।
- _मुझे पसंद है = गलत - नाम अनुरोधित नाम से बिल्कुल मेल खाना चाहिए।
- नाम - पुस्तक शीर्षक का सूचकांक, स्टार्ट ब्लॉक से पारित।
इंडेक्स 0 के साथ ऐरे एलिमेंट ब्लॉक का उपयोग करते हुए, हम परिणाम से पहली (और एकमात्र) पुस्तक लेते हैं।
एक किताब एक ही समय में कई अलग-अलग श्रेणियों से संबंधित हो सकती है, और इस मामले में, उनमें से कोई भी हमारे लिए उपयुक्त होगा। इसे रैंडम एलिमेंट ब्लॉक का उपयोग करके यादृच्छिक रूप से चुना जा सकता है
इसके बाद, हमारे पास सभी आवश्यक डेटा हैं, और जो कुछ बचा है वह स्वयं अनुरोध बनाना है, जो इस तरह दिख सकता है:
चुनें * public.book से जहां id IN (SELECT rel1_id FROM public.book_categorys_category_books_pivot WHERE Book_categorys_category_books_pivot.rel2_id = X) और id <> Y ऑर्डर बाय रैंडम() LIMIT 3
जहां X पुस्तक श्रेणी की आईडी है, और Y स्वयं पुस्तक की आईडी है।
कृपया ध्यान दें कि इस क्वेरी में एक सबक्वेरी शामिल है। सबसे पहले, Book_categorys_category_books_pivot तालिका से (इसका उपयोग दो तालिकाओं के बीच संबंधों के बारे में जानकारी संग्रहीत करने के लिए किया जाता है), चयनित श्रेणी के अनुरूप सभी पुस्तक पहचानकर्ता पाए जाते हैं। इसके बाद, एक क्वेरी निष्पादित की जाती है जो यादृच्छिक 3 पुस्तकों को ढूंढती है जो निर्दिष्ट सीमा से मेल खाती हैं, पुस्तक आईडी को छोड़कर, जिसका शीर्षक मूल रूप से व्यावसायिक प्रक्रिया को दिया गया था।
प्रोजेक्ट डेटाबेस संरचना के अधिक विस्तृत अध्ययन के लिए, आप डिप्लॉय प्लान सेटिंग्स में ओपन डीबी बटन का उपयोग कर सकते हैं।
यह आपको संपादक में डेटाबेस खोलने और डेटा को देखने और संपादित करने तक सीधी पहुंच प्राप्त करने की अनुमति देगा। हालाँकि, आपको सावधान रहना चाहिए और इस तथ्य को ध्यान में रखना चाहिए कि संपादक में डेटा संरचना को बदलने से प्रोजेक्ट को आगे प्रकाशित करना असंभव हो जाएगा।
आइए व्यवसाय प्रक्रिया बनाने पर वापस लौटें। अनुरोध के संकलन को पूरा करना आवश्यक है और ऐसा करने के लिए, पुस्तक और श्रेणी आईडी को पूर्णांक से स्ट्रिंग में परिवर्तित करें और कॉनकैट स्ट्रिंग्स (मल्टीपल) ब्लॉक का उपयोग करके अंतिम अनुरोध को भी इकट्ठा करें।
अंतिम चरण क्वेरी को निष्पादित करना, परिणाम को एक मॉडल में परिवर्तित करना और इसे क्वेरी परिणाम के रूप में एंड ब्लॉक में भेजना है।
आप अपने परिवर्तन सहेज सकते हैं, एक समापन बिंदु बना सकते हैं, अपना प्रोजेक्ट प्रकाशित कर सकते हैं और सत्यापित कर सकते हैं कि अनुरोध सही ढंग से काम करता है। इस मामले में, जटिल कंपाउंड क्वेरी वाले एक SQL Exec ब्लॉक का उपयोग कई अन्य ब्लॉकों को बदलने और व्यावसायिक प्रक्रिया की संरचना को सरल बनाने के लिए किया गया था।
SQL Exec ब्लॉक का उपयोग डेटा पुनर्प्राप्ति तक सीमित नहीं है और इसका उपयोग विभिन्न प्रकार के परिदृश्यों में किया जा सकता है। आइए कुछ और विकल्पों पर करीब से नज़र डालें।
- आईडी=एक्स वाली पुस्तक के लिए टिप्पणियों की संख्या की गणना करना
public.comment से COUNT(id) चुनें जहां Book_id = X - टिप्पणियों में दी गई सभी रेटिंगों को ध्यान में रखते हुए, किसी पुस्तक की औसत रेटिंग की गणना:
public.comment से AVG(दर) चुनें जहां Book_id = X - 2023 से पहले लिखी गई सभी टिप्पणियों को हटाना (उदाहरण के लिए, लॉग को जल्दी से साफ़ करने के लिए इस्तेमाल किया जा सकता है)।
हटाएं * public.comment से जहां बनाया_at < '2023-01-01'
अंत में, यह ध्यान देने योग्य है कि सुरक्षा में सुधार के लिए, खतरनाक संचालन के लिए SQL Exec ब्लॉक में एक फ़िल्टर जोड़ा गया है जिससे स्कीमा परिवर्तन हो सकते हैं।
यदि एप्लिकेशन AppMaster सर्वर पर होस्ट किया गया है, तो TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE के लिए CREATE/ALTER/DROP/TRUNCATE को फ़िल्टर द्वारा अक्षम कर दिया जाता है। ऑन-प्रिमाइसेस होस्ट करते समय - डिफ़ॉल्ट रूप से, कोई भी अनुरोध बिना किसी प्रतिबंध के उपलब्ध होता है।