postgresql - SQLALchemy "after_insert"不更新目标对象字段

标签 postgresql python-2.7 flask sqlalchemy flask-sqlalchemy

我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,该函数将更新对象的字段之一。我正在使用 after_insert 映射器事件来执行此操作。

我已经确认 after_insert 正确调用了 event_extract_audio_text() 处理程序,并且 target 正在更新为正确的 audio_text 值。但是,一旦事件处理程序完成执行,就不会为数据库中的对象设置文本值。

代码

# Event handler
def event_extract_audio_text(mapper, connect, target):

    # Extract text from audio file
    audio_text = compute_text_from_audio_file(target.filename)

    # Update the 'text' field with extracted text
    target.audio_text = audio_text

# Model
class SoundsRaw(db.Model):
    __tablename__ = 'soundsraw'

    id = db.Column(db.BigInteger(), primary_key=True, autoincrement=True)
    filename = db.Column(db.String(255))
    audio_text = db.Column(db.Text())

# Event listener
event.listen(SoundsRaw, 'after_insert', event_extract_audio_text)

我还尝试调用 db.session.commit() 以尝试使用文本值更新对象,但随后我得到以下堆栈跟踪:

File "/Users/alexmarse/.virtualenvs/techmuseum/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 219, in _assert_active
raise sa_exc.ResourceClosedError(closed_msg)

ResourceClosedError: This transaction is closed

有什么想法吗?

软件版本

SQLAlchemy 0.9.4 flask 0.10.1 Flask-SQLAlchemy 1.0

最佳答案

“after_insert”类处理程序的作用是直接使用连接。这是我的做法:

class Link(db.Model):
    "News link data."

    __tablename__ = 'news_links'

    id = db.Column(db.BigInteger, primary_key=True)
    slug = db.Column(db.String, unique=True) #, nullable=False 

    url = db.Column(db.String, nullable=False, unique=True)
    title = db.Column(db.String)
    image_url = db.Column(db.String)
    description = db.Column(db.String)

@db.event.listens_for(Link, "after_insert")
def after_insert(mapper, connection, target):
    link_table = Link.__table__
    if target.slug is None:
        connection.execute(
            link_table.update().
            where(link_table.c.id==target.id).
            values(slug=slugify(target.id))
        )

关于postgresql - SQLALchemy "after_insert"不更新目标对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25792332/

相关文章:

PostgreSQL Slony 复制 - 计划同步

sql - 如何仅使用 PostgreSQL 创建简单的模糊搜索?

postgresql - PostgreSQL 中的大小写不敏感

python - 索引会使 find_one() 更快吗?

python - 在python中定义一个类的 "boolness"

python - web.py app.request() 的 Flask/Werkzeug 等效项

ruby-on-rails - Rails + PostgreSQL - 使用 Like

python-2.7 - Python getpass.getpass()函数调用挂起

python - Flask 数据库问题

python - 如何使用按钮将sqlite Flask后端的数据显示到前端?