【问题标题】:Change object's attribute on session commit - Flask SQLAlchemy在会话提交时更改对象的属性 - Flask SQLAlchemy
【发布时间】:2014-10-16 20:51:26
【问题描述】:

我想在使用 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)

有没有一种方法可以连接任何信号以在将新对象插入数据库时​​执行函数并保存这些更改?

谢谢!

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    好的,我设法使用 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
    

    【讨论】:

    • 相信这里有一个重要的区别。 before_insert 发生在与models_committed 不同的会话时刻。 Source
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多