SQLAlchemy:如何在重复的条目中处理bulk_save_objects()?

时间:2017-12-05 16:41:31

标签: python mysql python-2.7 sqlite sqlalchemy

在我的项目中,我使用SQLAlchemy和bulk_save_objects() - 函数。对我来说,它是批量插入大量行的一种快捷方式。我已经设置了我的数据库(当前是SQLite),因此不需要重复的条目。当我尝试插入大量项目时,我不知道是否有重复的条目,并且我运行程序SQLAlchemy引发了IntegrityError异常,表示有重复的条目。这是我的问题:如何处理重复条目中的bulk_save_objects() - 函数? 当我使用SQLalchemy的add()函数时,很容易在for循环中捕获IntegrityError异常并忽略它。但是add() - 函数对于大量项目来说效果太慢。

1 个答案:

答案 0 :(得分:0)

如果您正在使用bulk_save_objects,我假设您从列表中的值开始。如果没有,您可以做的就是先将对象列表转换为值列表。

假设您的[ID,名称]列表中有一个重复的约翰: ls = [[1,John],[2,Mary],[3,Jude],[4,John]]

因此,John是重复的,您只想保留第一个“ John”值。 您要做的是: 1.浏览清单 2.将名称存储在字典中作为键。键值对为:“名称”:1 3.每次字典中已有一个现有的键(名称)时,请勿将其存储到新列表中

dict={}
new_ls=[]
for row in ls:
  if row[1] not in dict:
     new_ls.append(row)
  else:
     dict[row[1]]=1

now you can convert new_ls to a list of objects:
objects=[]
for item in new_ls:
   one_object=Person(ID=item[0],name=item[1]
   objects.append(one_object)

session.bulk_save_objects(objects)