在SQLAlchemy中添加多对多关系记录导致重复错误

3 投票
1 回答
728 浏览
提问于 2025-04-17 15:22

我有两个表:Book(书籍)和Author(作者),还有一个辅助表books_authors,代码大致如下:

book=Book()
for author in authors:
     a = Author()
     a.books.append(book)
     session.merge(a) #1

session.merge(book) #2
session.commit()     

这段代码会导致错误。

sqlalchemy.exc.IntegrityError: 
(IntegrityError) (1062, "Duplicate entry '1234' for key 'id'") 
'INSERT INTO `Book` (title, id)  VALUES (%s, %s)' ('test', u'1234')

我猜这是因为合并操作进行了两次(#1 和 #2)。

所以我决定去掉#1。这样就没有错误了,但在作者表中什么也没有显示。

当我决定去掉#2时,表格 Book、Author 和 books_authors 都能正确填充,只要每本书只添加一个作者。

如果添加多个作者,就会出现和之前类似的错误。

那么,#2的合并操作不合并添加的作者是正常的吗?它只在一个方向上工作吗?如果是的话,怎么才能在合并两个作者的条目时不重复书籍的条目呢?

1 个回答

0

我对你的应用代码不太熟悉,但你想做的事情大概是这样的:

如果书籍记录还没有,就插入这本书的记录。

如果作者记录还没有,就插入这个作者的记录。

如果书籍和作者的关联记录还没有,就插入这个关联记录。

为了避免重复的记录,可以使用这种语法。

insert into yourtable
(field1, field2, etc)
select distinct value1, value2, etc
from some_small_table
where not exists
(subquery to check for existing records)

根据你使用的数据库类型,some_small_table这一部分可能不是必需的。

撰写回答