2010-05-18 5 views
5

मैं आधार के रूप में sqlite3 का उपयोग कर अपने आवेदन के लिए डेटाबेस लाइब्रेरी का निर्माण कर रहा हूं। मैं इतना है कि यह संरचना करना चाहते हैं:मुझे अपने पायथन एप्लिकेशन के लिए एक सरल डेटाबेस पैकेज कैसे बनाना चाहिए?

 
db/ 
    __init__.py 
    users.py 
    blah.py 
    etc.py  

तो मैं अजगर में ऐसा होगा:

import db 
db.users.create('username', 'password') 

मैं विश्लेषण पक्षाघात (! ओह नहीं) कैसे डेटाबेस कनेक्शन को संभालने के लिए के बारे में पीड़ित कर रहा हूँ। मैं वास्तव में इन मॉड्यूल में कक्षाओं का उपयोग नहीं करना चाहता हूं, यह वास्तव में "उपयोगकर्ताओं" ऑब्जेक्ट्स का एक समूह बनाने में सक्षम होने के लिए उपयुक्त नहीं लगता है जो सभी एक ही डेटाबेस में उसी तरीके से हेरफेर कर सकते हैं - इसलिए कनेक्शन को विरासत में रखना एक जाना

मैं डेटाबेस है कि सभी मॉड्यूल का उपयोग करने के एक वैश्विक कनेक्शन होना चाहिए, और फिर प्रत्येक मॉड्यूल में इस डाल:

#users.py 
from db_stuff import connection 

या मैं प्रत्येक मॉड्यूल के लिए एक नया कनेक्शन बना सकते हैं और है कि जिंदा रखना चाहिए?

या क्या मुझे प्रत्येक लेनदेन के लिए एक नया कनेक्शन बनाना चाहिए?

इन डेटाबेस कनेक्शनों का उपयोग कैसे किया जाना चाहिए? कर्सर ऑब्जेक्ट्स के लिए यह वही है: क्या मैं प्रत्येक लेनदेन के लिए एक नया कर्सर बना सकता हूं? प्रत्येक डेटाबेस कनेक्शन के लिए केवल एक बनाएँ?

उत्तर

4

नहीं, कई मॉड्यूल पर कनेक्शन फैलाएं - यह खराब डिज़ाइन है। एक एकल कक्षा डीबी कनेक्शन को संभालें और अपने आवेदन में अन्य कक्षाओं/मॉड्यूल को सेवाएं प्रदान करें।

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

+0

अक्सर अनदेखा उपेक्षा की एक बहुत ही सुरुचिपूर्ण अभिव्यक्ति। – msw

+0

तो क्या एक वैश्विक कनेक्शन है लेकिन इसे कक्षा में लपेटें? यह एक वैश्विक कनेक्शन होने से बहुत अलग नहीं लगता है लेकिन इसे मॉड्यूल में डाल रहा है ... क्या प्रत्येक मॉड्यूल अपने कनेक्शन शुरू करने के लिए एक बुरी चीज है? –

+0

कभी नहीं, कुछ पढ़ने के बाद मुझे पता चला कि एक ही डेटाबेस के दो कनेक्शन इतने अच्छी तरह से काम नहीं करते हैं:/ –

3

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

यदि आप वास्तव में अपना खुद का काम करना चाहते हैं तो सबसे अच्छा तरीका कई कारकों पर निर्भर करेगा, उदाहरण के लिए क्या प्रोजेक्ट को केवल एक डेटाबेस के कनेक्शन की आवश्यकता है?

यदि यह एक साधारण सरल अनुप्रयोग है, तो मुझे लगता है कि एक वैश्विक कनेक्शन ऑब्जेक्ट आयात करना संभवतः जाने का तरीका है। आप हमेशा दृश्यों के पीछे कनेक्शन पूल के लिए इसे स्वैप कर सकते हैं, आदि

+0

यह एक काफी सरल ऐप है, यह सब पैकेज कर रहा है, वास्तव में प्रश्नों के समूह को नाम दे रहा है। मैं डेटाबेस कनेक्शन बनाने के लिए * कब * के बारे में अनिश्चित था। SQLAlchemy का सुझाव देने के लिए –

+0

+1, एक साधारण ऐप के लिए भी यह एक अच्छा विचार हो सकता है, यह डेटाबेस डेटाबेस क्वेरी को और अधिक पाइथनिक बनाता है :) यह आंतरिक रूप से कनेक्शन पूलिंग और प्रति-थ्रेड स्कोप्ड सत्र हैंडलिंग को लागू करता है ताकि आपको इन चीजों के बारे में चिंता करो। जब आपको इसकी आवश्यकता हो तो बस एक सत्र बनाएं और यह गोररी विवरण और अनुकूलन को संभालेगा। – wump

संबंधित मुद्दे

 संबंधित मुद्दे