2012-07-25 18 views
7

में ऑब्जेक्ट परिवर्तनों को अक्षम करने में अक्षम मैं प्रोजेक्ट में SQLAlchemy का उपयोग कर रहा हूं जो एक वेब अनुप्रयोग नहीं है। यह एक सर्वर अनुप्रयोग है जो डेटाबेस से विभिन्न ऑब्जेक्ट्स को लोड करता है और उन्हें स्थानीय रूप से संशोधित करता है, लेकिन जब भी कोई प्रतिबद्धता जारी की जाती है, तो डेटाबेस को उन अद्यतनों को डेटाबेस में सहेजना नहीं चाहते हैं। मैं पहले कुछ वेब परियोजनाओं के लिए डीजेंगो ओआरएम के साथ काम कर रहा था और यह पाया कि मैं जो हासिल करने की कोशिश कर रहा हूं उसके लिए यह बेहतर अनुकूल है। Django ORM में मैं प्रत्येक वस्तु को सहेज सकता था() (जब भी मैं अन्य चीजों को सहेजे बिना चाहता था मैं बचा सकता हूं। मैं समझता हूं कि यह स्क्लेक्लेमी में ऐसा क्यों काम करता है, लेकिन मुझे आश्चर्य है कि मैं Django जैसा तरीका कैसे कर सकता हूं?SQLAlchemy


अद्यतन: यह आसान है कि मैं क्या हासिल करने की कोशिश कर रहा हूँ समझने के लिए बनाने के लिए, मैं आपको एक उदाहरण प्रदान करेंगे।

यह कैसे यह वास्तव में काम करता है:

a = MyModel.query.get(1) 
b = MyModel.query.get(1) 

a.somefield = 1 
b.somefield = 2 

# this will save both of changed models 
session.commit() 

यह वह जगह है मैं इसे कैसे काम करना चाहता हूँ:

a = MyModel.query.get(1) 
b = MyModel.query.get(1) 

a.somefield = 1 
b.somefield = 2 

a.save() 
# I didn't want to save b, changes of b weren't committed 

मैं क्या वास्तव में सहेजा जाता है की अधिक से अधिक नियंत्रण चाहते हैं। मैं प्रत्येक 5 मिनट या उससे प्रत्येक ऑब्जेक्ट के परिवर्तनों को सहेजना चाहता हूं।

+0

क्या आपका खुद का समाधान मिला है? यदि आप कृपया साझा करते हैं। –

उत्तर

2

मैं कुछ ऐसा उपयोग करता हूं:

class BaseModel(object): 
    def save(self, commit=True): 
     # this part can be optimized. 
     try: 
      db.session.add(self) 
     except FlushError: 
      # In case of an update operation. 
      pass 

     if commit: 
      db.session.commit() 

    def delete(self, commit=True): 
     db.session.delete(self) 

     if commit: 
      db.session.commit() 

और फिर मैं के रूप में अपने मॉडल को परिभाषित:

class User(db.Model, BaseModel) 

तो, अब मैं कर सकते हैं:

u = User(username='foo', password='bar') 
u.save() 

यह आप क्या हासिल करने की योजना बना रहे थे?

2

मुझे यकीन नहीं है कि मैं आपकी परिस्थिति को समझता हूं।

Django में,

foo = MyModel(field1='value1', field2='value2') 
foo.save() 

या वैकल्पिक रूप से

foo = MyModel.objects.create(field1='value1', field2='value2') 

SQLAlchemy में, इस बिंदु पर

foo = MyModel(field1='value1', field2='value2') 
session.add(foo) 

आप केवल सत्र के लिए वस्तु को शामिल किया है और यह अभी तक नहीं है लेनदेन किया। आप के लिए प्रतिबद्ध करने के बाद ही किया तुमने जो कुछ भी परिवर्तन

session.commit() 

आवश्यक थे कि इस link एक बार देख ले की जरूरत है। मुझे लगता है कि यह Django ORM से SqlAlchemy तक संक्रमण को आसान बना देगा।

अद्यतन

ऐसी स्थिति के लिए, आप कई सत्रों इस्तेमाल कर सकते हैं।

engine = create_engine("postgresql+psycopg2://user:[email protected]/test") 
metadata = MetaData(bind=engine) 
Session = sessionmaker(bind=engine) 
session1 = Session() 
session2 = Session() 
Base = declarative_base() 
class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    age = Column(Integer) 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 
    def __repr__(self): 
     return "<User('%s','%s')>" % (self.name, self.age) 
Base.metadata.create_all(engine) 

'test' db में एक तालिका 'उपयोगकर्ता' बनाया गया। साथ ही, 2 सत्र ऑब्जेक्ट्स, सत्र 1 और सत्र 2, प्रारंभ किए गए हैं।

a = User('foo','10') 
b = User('bar', '20') 
session1.add(a) 
session1.add(b) 
session1.commit() 

तालिका उपयोगकर्ताओं को अब 2 रिकॉर्ड

1: foo, 10 
2: bar, 20 

लाई जा रही है 'foo' रिकॉर्ड session1 और सत्र 2 का उपयोग कर 'बार' गाना होगा।

foo = session1.query(User).filter(User.name == "foo").first() 
bar = session2.query(User).filter(User.name == "bar").first() 

परिवर्तन करना 2 रिकॉर्ड के

foo.age = 11 
bar.age = 21 

अब, आप foo के परिवर्तन अकेले, पर ले करना चाहते हैं

session1.commit() 

और बार के लिए,

session2.commit() 
+0

मैंने अपने प्रश्न को स्पष्ट करने के लिए संपादित किया है कि मैं क्या हासिल करने की कोशिश कर रहा हूं। – kjagiello

+0

मुझे अपने ऑब्जेक्ट में स्टोर किए जाने वाले प्रत्येक ऑब्जेक्ट के लिए एक सत्र की आवश्यकता होगी और ऐसा लगता है कि यह मेरे मामले में काफी बड़ा ओवरहेड बना देगा। – kjagiello

0

एक पुराने पोस्ट हलचल की कोई बात नहीं है, लेकिन

आप कहते हैं:

मैं प्रत्येक के परिवर्तनों को सहेजना चाहते हर 5 या दो मिनट आपत्ति है।

तो क्यों इस के साथ Celery की तरह एक अनुसूचक का उपयोग नहीं (मैं pyramid_celery का उपयोग करें)

आप प्रत्येक हर 5 मिनट में वस्तु को बचा सकता है, अर्थात आप एक डेकोरेटर जोड़ सकते हैं:।

@periodic_task(run_every=crontab(minute="*/5") 
def somefunction(): 
    #your code here 

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

आशा है कि इससे किसी की सहायता मिलती है प्रत्येक 5 मिनट भाग को सहेजने के साथ।