我在删除包含PostTag
和Post
列的Tag
表格中的记录时遇到问题。这是我的关系表:
tags = db.Table('PostTag',
db.Column('Tag', db.Integer, db.ForeignKey('Tag.Id')),
db.Column('Post', db.Integer, db.ForeignKey('Post.Id'))
)
和
tags = db.relationship(Tag, secondary=tags, backref=db.backref('Post', lazy='dynamic'))
当我这样做时:
from models.Post import Post
posts = Post.query.join(Post.tags).filter(Post.Id == id).all()
if(posts):
return posts
return False
然后
for posttag in post[0].tags:
db.session.delete(posttag)
db.session.flush()
删除多对多关系中的行,但也删除Tag
表中的记录。
我只需要删除PostTag
表中某些条件的记录(例如Post=1
)
我搜索了互联网,但我没有找到任何结论。我不需要在多对多关系上进行级联。
这是sql log:
297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 3
297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 18
297 Query DELETE FROM `Tag` WHERE `Tag`.`Id` = 14
最后一行297 Query DELETE FROM
代码WHERE
代码.
代表= 14
不应该在那里。
更新/可能解决方案
我通过以下方式解决了这个问题:
sql = 'DELETE FROM PostTag WHERE Post=%s'
db.engine.execute(sql, post, ())
但这不仅仅是ORM方式。插入也一样。我会尽力让这个解决ORM方式。如果我让这个问题消失,我会发表回答。
答案 0 :(得分:16)
试试这个:
post = db.session.query(Post).get(1)
post.tags = []
db.session.commit()
这里我们将集合post.tags
重新定义为空数组并提交更改。为了解释这一点,我将参考SQLAlchemy docs:
SQLAlchemy中的集合是透明检测的。检测意味着跟踪对集合的正常操作,并导致在刷新时将更改写入数据库。
因此,SQLAlchemy会跟踪我们对集合post.tags所做的更改,并在提交时对其进行更新。
如果我们只有一个标记(比如说sometag
),我们就可以像这样使用remove
方法:
post = db.session.query(Post).get(1)
post.tags.remove(sometag)
db.session.commit()
答案 1 :(得分:2)
尝试从集合中删除对象:
post[0].tags.clear()
您还可以删除单个项目:
post[0].tags.remove(posttag)