首页 > 解决方案 > 当我想删除两行时,为什么 SQLAlchemy 在这里需要 6 行?

问题描述

我正在使用 Flask-SQLAlchemy,我有以下表格:

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
    db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True))

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(250))
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author = db.Column(db.String(64))
    tags = db.relationship('Tag', secondary=tags, lazy='subquery',
        backref=db.backref('posts', lazy=True))
    published = db.Column(db.Boolean)
    slug = db.Column(db.String(300), unique=True, index=True)

    def save(self):
        if not self.slug:
            self.slug = re.sub('[^\w]+', '-', self.title.lower())

    def update_time(self):
        self.timestamp = datetime.utcnow()

    def __repr__(self):
        return '<Post {}>'.format(self.title)

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tag = db.Column(db.String(64), index=True, unique=True)

    def __repr__(self):
        return '<Tag {}>'.format(self.tag)

目前我正在制作一个功能以允许用户完全删除帖子,db.session.delete(post)并且我收到以下错误:

sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'tags' expected to delete 6 row(s); Only 2 were matched.

为什么删除语句需要 6 行?2 是正确的数字,对应于该帖子的标签表中有多少条目,该帖子附加了两个唯一标签。

标签: sqliteflask-sqlalchemy

解决方案


看来这里的问题是我的路线而不是我的模型。

将删除功能代码带到路线的开头给了我预期的行为;该帖子已从数据库中删除,并且助手表中的关联也已删除。

该错误是由我的路线中的某些代码引起的,该代码将所选标签从提交的表单附加到post.tags多次,导致预期为 6 行。


推荐阅读