表authors
和books
属于多对多关系。一本书可以有很多作者。作者可能写了很多书。
author_1 = Author('Dan')
session.add(author_1)
author_1.books = [Paper('Illuminati'), Book('Sacrileg')]
session.commit()
这会将两本书和一位作者添加到数据库并链接它们。到目前为止一切都很好。不同表格中的两列(authors.name
和books.title
)都是唯一的。
让我们添加一个新作者,让我们假设 Dan 有一些帮助写 Illuminati 。
author_2 = Author('Brownie')
session.add(author_2)
author_2.books = [Paper('Illuminati')]
session.commit()
这导致重复错误!这是为什么?我是否必须先查询Paper('Illuminati')
?如果我有一整套书籍怎么办?我是否必须查询其中的每一个?或者是否有自动功能,sqlalchemy如何确定某个条目是否已经存在并且只是链接到它?
答案 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