2010-05-04 18 views
19

में डायनामिक क्लास क्रिएशन हमें कई बाहरी डेटा स्रोतों तक पहुंचने के लिए एसक्यूएलकेमी कक्षाएं बनाने की आवश्यकता है जो समय के साथ-साथ बढ़ेगी। हम अपने कोर ओआरएम मॉडल के लिए घोषणात्मक आधार का उपयोग करते हैं और मुझे पता है कि हम स्वत: लोड का उपयोग करके मैन्युअल रूप से नए ओआरएम कक्षाओं को निर्दिष्ट कर सकते हैं = ऑटो को मैपिंग उत्पन्न करने के लिए सही है।SQLAlchemy

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

stored={} 
stored['tablename']='my_internal_table_name' 
stored['objectname']='MyObject' 

और कुछ में इस गतिशील रूप से की तरह मोड़:

class MyObject(Base): 
    __tablename__ = 'my_internal_table_name' 
    __table_args__ = {'autoload':True} 

हम नहीं चाहते

समस्या

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

यह कैसे पूरा किया जा सकता है इस पर कोई सुझाव बहुत सराहना की जाएगी।

धन्यवाद ...

उत्तर

24

आप गतिशील 3-argument call to type का उपयोग कर MyObject बना सकते हैं:

type(name, bases, dict) 

    Return a new type object. This is essentially a dynamic form of the 
    class statement... 

उदाहरण के लिए:

mydict={'__tablename__':stored['tablename'], 
     '__table_args__':{'autoload':True},} 

MyObj=type(stored['objectname'],(Base,),mydict) 
print(MyObj) 
# <class '__main__.MyObject'> 
print(MyObj.__base__) 
# <class '__main__.Base'> 
print(MyObj.__tablename__) 
# my_internal_table_name 
print(MyObj.__table_args__) 
# {'autoload': True} 
+0

लड़का ... मैं गूंगा लग रहा है। इतना आसान समाधान। मुझे एहसास नहीं हुआ कि विधि विधि इतनी शक्तिशाली थी। मैंने ऑब्जेक्ट नाम को वैश्विक स्थान में रखने के लिए थोड़ा सा समाधान संशोधित किया है, इसलिए इसे सीधे SQLAlchemy प्रश्नों में शामिल किया जा सकता है: ग्लोबल्स() [संग्रहीत ['objectname']] = प्रकार (संग्रहित '' objectname '], (बेस,), मैडिक्ट) धन्यवाद ... महान समाधान। – PlaidFan

+3

गूंगा महसूस मत करो! मैंने इस चाल को एसओ पर दूसरों का उपयोग करके देखकर सीखा। अब आप चाल भी जानते हैं और अपने दोस्तों को वाह कर सकते हैं। :) – unutbu