加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – SQLALchemy“after_insert”不更新目标对象字段

发布时间:2020-12-13 16:04:13 所属栏目:百科 来源:网络整理
导读:我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,它将更新一个对象的字段.我正在使用after_insert Mapper事件来执行此操作. 我已经确认after_insert正确调用了event_extract_audio_text()处理程序,目标正在使用正确的audio_text值进行更新.但
我有一个模型(见下面的代码),我想在插入一个对象后执行一个函数,它将更新一个对象的字段.我正在使用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

有任何想法吗?

软件版本

SQLAlchemy 0.9.4
烧瓶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))
        )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读