में नामित करने के लिए परिणाम पंक्तियों का मानचित्रण करना मैं स्क्लाइट 3 के लिए पायथन एपीआई के साथ थोड़ा सा खेल रहा हूं, मेरे पास आईडी, नाम और निर्माण_डेट फ़ील्ड के साथ स्टोर भाषाओं के लिए एक छोटी सी टेबल है। मैं कच्चे क्वेरी परिणामों को namedtuple
में मानचित्रों की अनुशंसा के रूप में मैप करने की कोशिश कर रहा हूं, इस तरह मैं पंक्तियों को अधिक पठनीय तरीके से प्रबंधित कर सकता हूं, इसलिए यहां मेरा namedtuple
है।पाइथन एसक्लाइट
LanguageRecord = namedtuple('LanguageRecord', 'id, name, creation_date')
कोड कि डॉक्स मानचित्रण के लिए सुझाव है कि इस प्रकार है:
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
यह ठीक है जब मैं भाषाओं का एक संग्रह वापस जाने के लिए चाहते हैं, लेकिन इस मामले में मैं सिर्फ एक प्राप्त करना चाहते हैं भाषा:
:c.execute('SELECT * FROM language WHERE name=?', (name,))
तो मेरी पहली कोशिश यह कुछ इस तरह था
इस कोड काम करता है नहीं करता है क्योंकि fetchone()
एक टपल बजाय एक टपल साथ एक सूची देता है, तो map
समारोह प्रत्येक टपल क्षेत्र विचार के लिए तीन namedtuples
एक बनाने के लिए प्रयास करता है।
मेरा पहला दृष्टिकोण हल करने के लिए इस तरह कुछ स्पष्ट रूप से एक सूची बना सकते हैं और इसे करने के लिए टपल परिणाम संलग्न करने के लिए, था:
languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
# do something with language
मेरे दूसरा दृष्टिकोण fetchall()
उपयोग करने के लिए हालांकि मैं सिर्फ एक रिकॉर्ड चाहते थे। मैं नाम फ़ील्ड को unique
डेटाबेस में केवल एक परिणाम को गारंट करने के लिए सेट कर सकता हूं।
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
एक और दृष्टिकोण सिर्फ एक परिणाम garantize को unique
विवश बिना उपयोग fetchall()[0]
हो सकता है।
मेरा प्रश्न यह है कि इस समस्या से निपटने का सबसे अच्छा और आम तरीका है, क्या मुझे हमेशा एक सामान्य इंटरफ़ेस बनाए रखने के लिए fetchall
का उपयोग करना चाहिए और डेटाबेस को विशिष्टता तर्क प्रबंधित करना चाहिए? या क्या मुझे दृष्टिकोण 1 में स्पष्ट रूप से एक सूची बनाना चाहिए? क्या इस कार्य को पूरा करने का कोई आसान तरीका है?
तुम भी डेटाबेस कर्सर पुनरावृति कर सकते हैं, वहाँ सभी रिकॉर्ड लाने के लिए कोई जरूरत नहीं है, जब तक आप चाहते हैं करने के लिए, इसलिए कोड को 'मानचित्र (LanguageRecord._make, c) 'के रूप में पुनः लिखा जा सकता है। –