2012-08-02 8 views
5

हम अपने कोड में हार्डकोडिंग को रोकने के लिए कॉलम मैपिंग करने के लिए sqlalchemy की स्वत: लोड सुविधा का उपयोग कर रहे हैं।sqlalchemy autoloaded orm persistence

class users(Base): 
    __tablename__ = 'users' 
    __table_args__ = { 
     'autoload': True, 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

वहाँ एक क्रमानुसार करने या जिस तरह से कैश autoloaded मेटाडाटा/ORMS तो हम autoload प्रक्रिया के माध्यम से हर बार जब हम अन्य लिपियों/कार्य से हमारे ORM वर्गों को संदर्भित करने की जरूरत है जाने की जरूरत नहीं है है?

मैंने बीकर कैशिंग और अचार को देखा है, लेकिन यदि यह संभव है या इसे कैसे किया जाए तो स्पष्ट उत्तर नहीं मिला है।

आदर्श रूप में हम autload मानचित्रण स्क्रिप्ट केवल चलाने जब हम अपने डेटाबेस संरचना में परिवर्तन किया है लेकिन अन्य सभी लिपियों/कार्य से एक गैर autoload/लगातार/हमारे डेटाबेस मानचित्रण का संचित संस्करण का संदर्भ,

कोई भी विचार?

+0

आप दूसरे तरीके से क्यों नहीं करते हैं: एसए में पूर्ण उड़ा मॉडल को परिभाषित करें। साइड इफेक्ट के रूप में, यह डेटाबेस स्कीमा के लिए आपके स्रोत नियंत्रण के रूप में कार्य करेगा। * बेशक, यह केवल तभी काम करता है जब आपके एसए एप्लिकेशन में डेटाबेस (0) का प्राथमिक नियंत्रण होता है जो आप * – van

+0

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

उत्तर

5

अब मैं क्या कर रहा हूं डेटाबेस डेटाबेस (MySQL) के माध्यम से प्रतिबिंब चलाने के बाद मेटाडेटा को चुनना है और एक बार एक अचार उपलब्ध है जो एक SQLite इंजन से जुड़े मेटाडेटा के साथ स्कीमा पर प्रतिबिंबित करने के लिए मसालेदार मेटाडेटा का उपयोग करता है।

cachefile='orm.p' 
dbfile='database' 
engine_dev = create_engine(#db connect, echo=True) 
engine_meta = create_engine('sqlite:///%s' % dbfile,echo=True) 
Base = declarative_base() 
Base.metadata.bind = engine_dev 
metadata = MetaData(bind=engine_dev) 

# load from pickle 
try: 
    with open(cachefile, 'r') as cache: 
     metadata2 = pickle.load(cache) 
     metadata2.bind = engine_meta 
     cache.close() 
    class Users(Base): 
     __table__ = Table('users', metadata2, autoload=True) 

    print "ORM loaded from pickle" 

# if no pickle, use reflect through database connection  
except: 
    class Users(Base): 
     __table__ = Table('users', metadata, autoload=True) 

print "ORM through database autoload" 

# create metapickle 
metadata.create_all() 
with open(cachefile, 'w') as cache: 
    pickle.dump(metadata, cache) 
    cache.close() 

कोई टिप्पणी अगर यह ठीक है (यह काम करता है) या कुछ ऐसा है जो मैं सुधार सकता हूं?

+2

आप शायद मेटाडेटा ऑब्जेक्ट का उपयोग करने के लिए इसे सरल बना सकते हैं, और यह निर्धारित करने के लिए कि क्या आप अनपिक हैं या नहीं, बस एक साधारण "if oath.path.exists (cachefile)" करें। "तालिका ('उपयोगकर्ता', मेटाडाटा, ऑटोलोड = ट्रू)" और इस तरह की केवल एक बार कहा जाना चाहिए क्योंकि जैसा कि आपने पहले ही देखा है कि यह तालिका प्रतिबिंब को छोड़ देती है यदि तालिका मेटाडेटा में पहले से ही है। – zzzeek

+1

मुझे लगता है कि 'with' कथन के अंदर उपयोग किए जाने पर फ़ाइल को बंद करने की आवश्यकता नहीं है, लेकिन यह संबंधित नहीं है। आपका दृष्टिकोण दिलचस्प लगता है, क्या यह उम्मीद के अनुसार काम कर रहा है? – jadkik94