Я пытаюсь настроить каскадное удаление в отношении соединения. Однако всякий раз, когда я пытаюсь удалить сообщение в своем приложении, я получаю сообщение об ошибке, в котором говорится, что «обновление или удаление в таблице« сообщение »нарушает ограничение внешнего ключа». Вот фотография сообщения об ошибке:
Вот мой код:
class Post(db.Model):
"""Blog posts"""
__tablename__ = "posts"
id = db.Column(db.Integer,
primary_key=True,
autoincrement=True)
title = db.Column(db.String(25),
nullable=False)
content = db.Column(db.String(500),
nullable=False)
created_at = db.Column(db.DateTime,
default=db.func.current_timestamp())
user_table = db.Column(db.Integer,
db.ForeignKey('users.id',
ondelete='CASCADE'))
tags = db.relationship('Tag',
secondary = "post_tags",
back_populates = "posts",
cascade = "all, delete"
)
class Tag(db.Model):
__tablename__ = "tags"
id = db.Column(db.Integer,
primary_key=True,
autoincrement=True)
name = db.Column(db.String,
unique=True)
posts = db.relationship('Post',
secondary = "post_tags",
back_populates = "tags")
class Post_Tag(db.Model):
__tablename__ = "post_tags"
post_id = db.Column(db.Integer,
db.ForeignKey('posts.id'), primary_key=True)
tag_id = db.Column(db.Integer,
db.ForeignKey('tags.id'), primary_key=True)
Основываясь на документации и других вопросах, которые я просмотрел, я, кажется, правильно это настраиваю. Что я здесь делаю неправильно?
ОБНОВЛЯТЬ Я могу удалять теги, но не могу удалять сообщения
Вы можете получить эту ошибку, потому что вы используете backref
вместо back_populates
...
Кроме того, я бы предложил определить ваши отношения двунаправленно, то есть как в родительской Post
, так и в дочерней Tag
моделях. Это позволяет выполнять каскадное удаление во вторичной таблице с различными правилами в зависимости от того, какой объект удаляется.
Следующие изменения в ваших моделях должны исправить ошибку, которую вы получаете:
# Modify your tags relationship to the following:
class Post(db.Model):
...
tags = db.relationship(
'Tag',
secondary = "post_tags",
back_populates = "posts", # use back-populates instead of backref
cascade = "all, delete"
)
# Also, define your relationship from your tag model
class Tag(db.Model):
__tablename__ = "tags"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String, unique=True)
posts = db.relationship(
'Post',
secondary = "post_tags",
back_populates = "tags", # use back-populates instead of backref
# When a parent ("post") is deleted, don't delete the tags...
passive_deletes=True
)
Спасибо. Похоже, это решило проблему с возможностью удаления тегов. Тем не менее, я все еще получаю ту же ошибку, когда пытаюсь удалить сообщение.
В этом случае вы захотите удалить ondelete = "CASCADE"
из post_tags.tag_id
(однако оставьте для post_tags.post_id
. @rudehlabya -->
Включите
ondelete = "CASCADE"
дляpost_tags.post_id
...