我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,它将更新一个对象的字段.我正在使用after_insert Mapper事件来执行此操作.
我已经确认after_insert正确调用了event_extract_audio_text()处理程序,目标正在使用正确的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
有任何想法吗?
软件版本
解决方法
‘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)) )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。