2014-10-16 9 views
7

मैं Falsk-SQLAlachemy का उपयोग करके डीबी में डालने से पहले किसी ऑब्जेक्ट की विशेषता को बदलना चाहता हूं। मैं before_models_committed संकेत उपयोग करने की कोशिश, लेकिन यह टूट किया जा रहा है, तो मैं बजाय models_commited कर रहा हूँ: प्रयास करने (और परिवर्तन फिर से करने से) और मैं निम्नलिखित त्रुटि मिलती है:सत्र प्रतिबद्धता पर ऑब्जेक्ट की विशेषता बदलें - फ्लास्क SQLAlchemy

InvalidRequestError: This session is in 'committed' state; no further SQL can be emitted within this transaction.

कोड bellow प्रदान की जाती है:

from app import db 
from app import app 
from flask.ext.sqlalchemy import models_committed 

class Foo(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    foo_attr = db.Column(db.String(128), index=True) 

def on_models_committed(app, changes): 
    for change in changes: 
     foo_obj = change[0] 
     operation = change[1] 
     if foo_obj.__class__.__name__ == 'Foo': 
      if operation == 'insert': 
       foo_obj.foo_attr = get_new_value() 
       db.session.add(foo_obj) 
       db.session.commit() 
models_committed.connect(on_models_committed) 

क्या किसी भी कार्य को निष्पादित करने के लिए किसी भी सिग्नल को जोड़ने का कोई तरीका है जब भी कोई नई वस्तु डीबी में डाली जाती है और उन परिवर्तनों को सहेजती है?

धन्यवाद!

उत्तर

3

ठीक है, मैं इसे SQLAlchemy मैपर घटनाओं का उपयोग करके करने के लिए प्रबंधित करता हूं।

इस कोड:

def on_models_committed(app, changes): 
    for change in changes: 
     foo_obj = change[0] 
     operation = change[1] 
     if foo_obj.__class__.__name__ == 'Foo': 
      if operation == 'insert': 
       foo_obj.foo_attr = get_new_value() 
       db.session.add(foo_obj) 
       db.session.commit() 
models_committed.connect(on_models_committed) 

इस कोड से प्रतिस्थापित किया जाना चाहिए:

def on_foo_created(mapper, connection, foo_obj): 
    foo_obj.foo_attr = get_new_value() 
event.listen(Foo, 'before_insert', on_foo_created) 

और नई आयात कथन है:

from flask.ext.sqlalchemy import event 
+0

विश्वास है कि यहां एक महत्वपूर्ण अंतर है। 'models_committed' की तुलना में 'pre_insert' सत्र में एक अलग पल पर होता है। [स्रोत] (https://pythonhosted.org/Flask-SQLAlchemy/signals.html#models_committed) –

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