如何在SQLAlchemy中删除多对多(辅助)表中的记录?

2024-03-29 06:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在从包含PostTag列的PostTag表中删除记录时遇到问题。这是我的关系表:

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日志:

 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标记.Id= 14不应存在。

更新/可能的解决方案

我解决这个问题的方法是:

sql = 'DELETE FROM PostTag WHERE Post=%s'
db.engine.execute(sql, post, ())

但这不仅仅是ORM的方式。插入也一样。我会设法解决这个问题的。如果我把这个问题解决了,我会贴出答案的。


Tags: fromiddbsql关系tag记录tags
2条回答

尝试从集合中移除对象:

post[0].tags.clear()

您还可以删除单个项目:

post[0].tags.remove(posttag)

试试这个:

post = db.session.query(Post).get(1)
post.tags = []
db.session.commit()

在这里,我们将集合post.tags重新定义为空数组并提交更改。为了解释这一点,我将参考SQLAlchemy docs

Collections in SQLAlchemy are transparently instrumented. Instrumentation means that normal operations on the collection are tracked and result in changes being written to the database at flush time.

因此,SQLAlchemy会跟踪我们对集合post.tags所做的更改,并在提交时对其进行更新。

如果我们只有一个标记(比如sometag),我们可以使用remove方法,如下所示:

post = db.session.query(Post).get(1)
post.tags.remove(sometag)
db.session.commit()

相关问题 更多 >