- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,该函数将更新对象的字段之一。我正在使用 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.1Flask-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/
我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,该函数将更新对象的字段之一。我正在使用 after_insert 映射器事件来执行此操作。 我已经确认 after_insert 正确调
我有表 A 和表 B,我想在表 A 事件中添加/更新/删除表 B 中的列。我尝试了以下方法: Mapper 事件 a.k.a @event.listens_for(SomeClass, 'before
所以我是 SQLAlchemy 的新手,我希望在创建新的 User 对象后默认创建一个 Permissions 对象。阅读文档似乎我应该使用 after_insert 映射器事件。问题是事件监听器在对
我是一名优秀的程序员,十分优秀!