Google की Bigquery में, SQL क्वेरी को पैरामीटरयुक्त किया जा सकता है। यदि आप इस अवधारणा से परिचित नहीं हैं, तो मूल रूप से इसका मतलब है कि आप SQL क्वेरी को इस तरह पैरामीटरयुक्त टेम्पलेट के रूप में लिख सकते हैं:
INSERT INTO mydataset.mytable(columnA, columnB) VALUES (@valueA, @valueB)
और मानों को अलग से पास करें। इसके कई फायदे हैं:
पायथन स्क्रिप्ट से क्वेरी पैरामीटर पास करना पहली नजर में सीधा प्रतीत होता है। उदाहरण के लिए:
from google.cloud.bigquery import ( Client, ScalarQueryParameter, ArrayQueryParameter, StructQueryParameter, QueryJobConfig, ) client=Client() client.query(" INSERT INTO mydataset.mytable(columnA, columnB) VALUES (@valueA, @valueB) ", job_config=QueryJobConfig( query_parameters=[ ScalarQueryParameter("valueA","STRING","A"), ScalarQueryParameter("valueB","STRING","B") ])
ऊपर दिया गया उदाहरण कॉलम ए और बी में सरल ("स्केलर") मान सम्मिलित करता है। लेकिन आप अधिक जटिल पैरामीटर भी पास कर सकते हैं:
समस्याएं तब उत्पन्न होती हैं जब आप संरचनाओं की सारणी सम्मिलित करना चाहते हैं: वेब पर इस विषय पर कई गठजोड़, लगभग कोई दस्तावेज नहीं और बहुत कम संसाधन हैं। इस लेख का लक्ष्य इस अंतर को भरना है।
आइए निम्नलिखित ऑब्जेक्ट को परिभाषित करें जिसे हम अपनी गंतव्य तालिका में संग्रहीत करना चाहते हैं
from dataclasses import dataclass @dataclass class Country: name: str capital_city: str @dataclass class Continent: name: str countries: list[Country]
इस पैरामीटरयुक्त क्वेरी को लागू करके
query = UPDATE continents SET countries=@countries WHERE name="Oceania"
उथले दस्तावेज़ का पालन करके पहला प्रयास होगा
client.query(query, job_config=QueryJobConfig(query_parameters=[ ArrayQueryParameter("countries", "RECORD", [ {name="New Zealand", capital_city="Wellington"}, {name="Fiji", capital_city="Suva"} ...] ]))
जो बुरी तरह विफल हो जाएगा
AttributeError: 'dict' ऑब्जेक्ट में कोई विशेषता नहीं है 'to_api_repr'
यह पता चलता है कि कंस्ट्रक्टर का तीसरा तर्क - मान- स्ट्रक्चरक्वेरी पैरामीटर उदाहरणों का संग्रह होना चाहिए, न कि सीधे वांछित मान। तो आइए उनका निर्माण करें:
client.query(query, job_config=QueryJobConfig(query_parameters=[ ArrayQueryParameter("countries", "RECORD", [ StructQueryParameter("countries", ScalarQueryParameter("name", "STRING", ct.name), ScalarQueryParameter("capital_city", "STRING", ct.capital_city) ) for ct in countries]) ]))
इस बार यह काम करता है... जब तक आप एक खाली सरणी सेट करने का प्रयास नहीं करते
client.query(query, job_config=QueryJobConfig( query_parameters=[ ArrayQueryParameter("countries", "RECORD", []) ]))
ValueError: एक खाली सरणी के लिए विस्तृत संरचना आइटम प्रकार की जानकारी गुम है, कृपया एक structQueryParameterType उदाहरण प्रदान करें।
त्रुटि संदेश बिल्कुल स्पष्ट है: "रिकॉर्ड" बिगक्वेरी के लिए यह जानने के लिए पर्याप्त नहीं है कि आपके खाली सरणी के साथ क्या करना है। इसके लिए पूर्ण विस्तृत संरचना की आवश्यकता है। ऐसा ही हो
client.query(query, job_config=QueryJobConfig(query_parameters=[ ArrayQueryParameter("countries", StructQueryParameterType( ScalarQueryParameterType("STRING","name"), ScalarQueryParameterType("STRING","capital_city") ), []) ]))
(ध्यान दें कि ...पैरामीटर टाइप कंस्ट्रक्टर के तर्कों का क्रम ...पैरामीटर कंस्ट्रक्टर के विपरीत है। सड़क पर बस एक और जाल...)
और अब यह खाली सरणियों के लिए भी काम करता है, वाह!
जानने लायक एक आखिरी बात: StructQueryParameterType के प्रत्येक उपक्षेत्र का एक नाम होना चाहिए, भले ही कंस्ट्रक्टर में दूसरा पैरामीटर (नाम) वैकल्पिक हो। यह वास्तव में उपक्षेत्रों के लिए अनिवार्य है, अन्यथा आपको एक नई प्रकार की त्रुटि मिलेगी
खाली संरचना फ़ील्ड नाम
मुझे लगता है कि क्वेरी पैरामीटर्स में रिकॉर्ड्स की सरणियों के उपयोग को पूरा करने के लिए हमें बस इतना ही जानना आवश्यक है, मुझे आशा है कि इससे मदद मिलेगी!
पढ़ने के लिए धन्यवाद! मैं मैथ्यू हूं, स्टैक लैब्स में डेटा इंजीनियर।
यदि आप स्टैक लैब्स डेटा प्लेटफ़ॉर्म की खोज करना चाहते हैं या उत्साही डेटा इंजीनियरिंग टीम में शामिल होना चाहते हैं, तो कृपया हमसे संपर्क करें।
फोटो डे डेनिस नेवोझाई सुर अनस्प्लैश
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3