【问题标题】:how to handle sqlalchemy onupdate when current context is empty?当前上下文为空时如何处理sqlalchemy onupdate?
【发布时间】:2019-06-26 21:41:56
【问题描述】:

我有一个文章模型,根据它的标题会有 slug,模型是这样的:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text

Base = declarative_base()


class Article(Base):

    __tablename__ = 'article'

    id = Column(Integer, primary_key=True)
    title = Column(String(100), nullable=False)
    content = Column(Text)
    slug = Column(String(100), nullable=False,
                  default=lambda c: c.current_params['title'],
                  onupdate=lambda c: c.current_params['title'])

slug 正在获取标题的值。所以,每次文章slug 都会匹配它的标题。但是,当我在不更改标题的情况下编辑内容时,这 引发异常

(builtins.KeyError) 'title' [SQL: 'UPDATE article SET content=?, slug=?,
updated_at=? WHERE article = ?'] [parameters: [{'article_id': 1,
'content': 'blah blah blah'}]]

我猜是因为current_params 不包含title。如果,我改变 那里的lambda 并使用if,slug 将是None。那我该如何处理 这并保持 slug 值匹配它的标题?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    你可以使用validates() decorator:

    from sqlalchemy.orm import validates
    
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100), nullable=False)
        content = db.Column(db.String)
        slug = db.Column(db.String(100), nullable=False)
    
        @validates('title')
        def update_slug(self, key, title):
            self.slug = title
            return title
    

    events:

    from sqlalchemy import event
    
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100), nullable=False)
        content = db.Column(db.String)
        slug = db.Column(db.String(100), nullable=False)
    
    @event.listens_for(Article.title, 'set')
    def update_slug(target, value, oldvalue, initiator):
        target.slug = value
    

    【讨论】:

    • 但是请注意,@validates 在 INSERT 和 UPDATE 上都会触发,因此有些人可能不认为这是 onupdate 的可行替代品(这导致了问题中的问题)。这是一个优雅的解决方案,但如果一个人有相同的default+onupdate :-)
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2022-01-17
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多