假设有多对多关系(sqlalchemy,python),如何避免添加重复项?

时间:2011-07-02 17:59:18

标签: python many-to-many sqlalchemy duplicates

authorsbooks属于多对多关系。一本书可以有很多作者。作者可能写了很多书。

author_1 = Author('Dan')
session.add(author_1)
author_1.books = [Paper('Illuminati'), Book('Sacrileg')]
session.commit()

这会将两本书和一位作者添加到数据库并链接它们。到目前为止一切都很好。不同表格中的两列(authors.namebooks.title)都是唯一的。

让我们添加一个新作者,让我们假设 Dan 有一些帮助写 Illuminati

author_2 = Author('Brownie')
session.add(author_2)
author_2.books = [Paper('Illuminati')]
session.commit()

这导致重复错误!这是为什么?我是否必须先查询Paper('Illuminati')?如果我有一整套书籍怎么办?我是否必须查询其中的每一个?或者是否有自动功能,sqlalchemy如何确定某个条目是否已经存在并且只是链接到它?

1 个答案:

答案 0 :(得分:2)

这基本上是@renatopp评论的长版本

  

这导致重复错误!那是为什么?

您创建的新书/纸类似于数据库中的书籍/纸张。我认为你设置了具有唯一约束的纸张/书籍name

  

我是否必须首先查询Paper('Illuminati')?

让我们看看你之前说过的话

  

让我们添加一个新作者,让我们假设Dan在编写Illuminati时有一些帮助。

这位新作者帮助Dan写了 Illuminati 。已经在db上的Illuminati了。你的代码意味着“布朗尼写了一本与丹的名字相同的新书”。所以有两本书,因此重复错误。

如果你想要“布朗尼帮助丹”,那么你必须让他写一本相同的书。从数据库中获取Dan的Illuminati,并告诉Brownie帮助Dan。

    # illuminati = Dan's book from db
    author_2.books.append(illuminati)

我在那里更改了代码。纠正我,如果我错了,我想你的意思是给布朗尼增加一本书,而不是删除他所有的书并随后给他一本书(author_2.books = [Paper('Illuminati')]

  

如果我有一整套书籍怎么办?我是否必须查询其中的每一个?

这取决于。它们都是新书吗?还是现有的书?也许只有其中一些是新的?或者你根本不知道?

您必须检查它们,或尝试catching the exception