【发布时间】:2014-11-05 16:35:01
【问题描述】:
我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,该函数将更新对象的一个字段。我正在使用 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 烧瓶 0.10.1 Flask-SQLAlchemy 1.0
【问题讨论】:
-
嘿@alex-marse,你解决了吗?有同样的问题..干杯
-
嘿@ducu,看看我刚刚发布的答案。我认为解决 ResourceClosedError 的是第二个代码块中的
create_db_session()行,所以也许你可以在 Mapper Event 代码中使用它,看看它是如何工作的。我很好奇。 -
感谢您的回复,我在其他地方发现了类似的问题(不记得了),我将在下面发布解决方案,它对我有用,我会说它比您的解决方案更清洁下面
标签: postgresql python-2.7 flask sqlalchemy flask-sqlalchemy