2014-10-16 12 views
7

Chcę zmienić atrybut obiektu, zanim zostanie wstawiony do bazy danych przy użyciu Falsk-SQLAlachemy. Próbowałem za pomocą before_models_committed sygnał, ale wydaje się być uszkodzony, więc staram models_commited zamiast (i ponownego popełnienia zmian) i pojawia się następujący błąd:Zmiana atrybutu obiektu podczas zatwierdzania sesji - Flask SQLAlchemy

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

Kod jest mowa poniżej:

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) 

Czy istnieje sposób łączenia dowolnych sygnałów w celu wykonania funkcji za każdym razem, gdy nowy obiekt zostanie wstawiony do bazy danych i zapisać te zmiany?

Dzięki!

Odpowiedz

3

Ok, udaje mi się to zrobić za pomocą SQLAlchemy Mapper Events.

ten kod:

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) 

powinny zostać zastąpione przez ten kod:

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

A nowa deklaracja importowa jest:

from flask.ext.sqlalchemy import event 
+0

że istnieje ważna różnica tutaj. 'before_insert' dzieje się w innym momencie sesji niż' models_committed'. [Źródło] (https://pythonhosted.org/Flask-SQLAlchemy/signals.html#models_committed) –

Powiązane problemy