bsm*_*tto 7 python flask flask-sqlalchemy
我想在使用Falsk-SQLAlachemy将对象的属性插入数据库之前更改它.我尝试使用before_models_committed信号,但它似乎被破坏了,所以我正在尝试使用models_commited(并重新提交更改),我收到以下错误:
InvalidRequestError:此会话处于"已提交"状态; 此事务中不能再发出SQL.
代码如下:
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)
Run Code Online (Sandbox Code Playgroud)
每当将新对象插入数据库并保存这些更改时,是否存在连接任何信号以执行函数的方法?
谢谢!
好的,我设法使用 SQLAlchemy Mapper Events 来做到这一点。
这段代码:
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)
Run Code Online (Sandbox Code Playgroud)
应替换为以下代码:
def on_foo_created(mapper, connection, foo_obj):
foo_obj.foo_attr = get_new_value()
event.listen(Foo, 'before_insert', on_foo_created)
Run Code Online (Sandbox Code Playgroud)
新的导入语句是:
from flask.ext.sqlalchemy import event
Run Code Online (Sandbox Code Playgroud)