首页 > 解决方案 > SQLAlchemy 与额外数据(关联对象)的多对多关系 - 如何删除

问题描述

我正在使用 SQLAlchemy(与 MySQL)和 Python。

我之前已经成功地使用了 SQLAlchemy 的多对多关系,我发现它们非常直观且易于使用。在这两种情况下,我都有 Memberships 和 MembershipTypes,每一个都是数据库中的一个类和一个表。

以前,当我设置它时,我可以很容易地清除对象的关联。它将是 Membership.MembershipTypes.clear() 然后是提交。

但现在情况有些不同了。我使用此处列出的模型来设置带有额外数据的关联对象。带有额外数据的版本需要对我以前的操作方式进行一些更改(老实说,以前更容易,但我需要这种方式,所以我们就可以了)。尽管如此,它仍然有效。我似乎无法弄清楚如何做的一件事是从关联表中删除条目。现在,在我的情况下,我已将“父”更改为“会员”,将“子”更改为“会员类型”,将“关联”更改为“会员会员类型”,但除此之外,它的设置方式与示例链接相同。

在 Membership 之前有一个 MembershipTypes 列表,这是一个关系。您可以添加和删除,也可以清除该列表,然后承诺清除关联。它是如此美好和容易。现在 Membership 仍然有一个该名称的列表,但类型不同。这次的类型是关联对象(MembershipMembershipType)。添加起来并不难:

memb01.membershiptypes.append(MembershipMembershipType(membershipType=membType01, quantity=6))

这为成员资格 (memb01) 设置了成员资格类型以及使用关联对象的额外数据(数量)。我认为我可以通过简单的 clear and commit 以类似于我之前所做的方式来删除关联。

因为我认为它会以类似的方式工作,所以我尝试了以下方法:

memberships = sqlInterface.session.query(Membership).all()
memberships[0].membershiptypes.clear()

但是,当我调用提交时,我收到以下错误消息:

AssertionError: Dependency rule tried to blank-out primary key column 'membershipmembershiptypes.membership_id' on instance '<MembershipMembershipType at 0x3c9d390>'

老实说,我不确定我是否理解错误消息。我猜“空白”意味着删除该主键?这不是我想做的吗?

简而言之,如何删除给定 Membership 的关联?理想情况下使用 Python 端而不是为数据库编写查询。

标签: pythonmysqlsqlalchemy

解决方案


推荐阅读