私はFlask-SQLAlchemyを使用しています。私は、関連テーブルを介して関係を共有する2つのクラスを持っています。テーブルの1つの行を削除しようとしたとき。Flask SQLAlchemy多対多StaleDataError
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('post_id', db.Integer, db.ForeignKey('posts.id'))
)
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
tags = db.relationship('Tag', secondary=tags,
backref=db.backref('posts', lazy='dynamic'))
def __init__(self, **kwargs):
super(Post, self).__init__(**kwargs)
def __repr__(self):
return '<title %r>' % self.title
class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), unique=True)
Anが、ここで私は削除するために実行コードは次のとおりです:ここで
sqlalchemy.orm.exc.StaleDataError
StaleDataError: DELETE statement on table 'tags' expected to delete 1 row(s); Only 2 were matched.
は私のモデルです:私は次のエラーを参照してください私は、ストライプダウンバージョンを試してみました
def remove_tag(tag_id):
tag = Tag.query.get(tag_id)
for post in tag.posts:
p = Post.query.get(post.id)
p.tags.remove(tag)
db.session.delete(tag)
db.session.commit()
このコードの、このアプリの外で、スタンドアロンテスト、dbと環境。そして、それは期待どおりにタグと関連するテーブルの行を削除して動作します。
何可能であれば、私は、知っているしたいと思います:
- にはどうすればStaleDataErrorの状況になりましたか?
- .all()へのクエリで複数の用途が表示されない場合、なぜ複数の行に一致するのですか?
- これを防ぐにはどうすればよいですか?
ご協力いただきありがとうございます。
ベスト、 エドワード
私はあなたの例でいくつかのインデントを修正しましたが、 'remove_tag()'をそのまま残しましたが、何らかのエラーもあるようです。確認できますか? –