sqlite - 当我想删除两行时,为什么 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 是正确的数字,对应于该帖子的标签表中有多少条目,该帖子附加了两个唯一标签。
解决方案
看来这里的问题是我的路线而不是我的模型。
将删除功能代码带到路线的开头给了我预期的行为;该帖子已从数据库中删除,并且助手表中的关联也已删除。
该错误是由我的路线中的某些代码引起的,该代码将所选标签从提交的表单附加到post.tags
多次,导致预期为 6 行。
推荐阅读
- python - 如何从列表中删除某些值的对象?
- composer-php - 任何人都可以在 Pantheon 上安装 Drupal 8 Thunder(带 Composer)?
- node.js - @bigcommerce/stencil-cli | 节点 v10.6.0 上的错误
- mysql - Mysql:2个具有唯一ID的表
- python - 自动将数据框的列标题传递到一列中,并将相应的值作为新列
- output - 在 Racket 中处理输入和输出
- java - 使用 loopj 库中的 get 方法从 git hub api v3 接收数据
- php - 对象数组属性在加载数组时添加索引
- asp.net-mvc - ASP.NET - SVG 到 PDF
- java - H2 数据库 - 如何初始化多个模式 (yml)