在SQLAlchemy中添加多对多关系记录导致重复错误
我有两个表: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这一部分可能不是必需的。