【问题标题】:SQLAlchemy: How to deal with bulk_save_objects() in duplicate entries?SQLAlchemy:如何处理重复条目中的 bulk_save_objects()?
【发布时间】:2018-05-19 09:40:55
【问题描述】:

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

【问题讨论】:

  • 在 SQLite 的情况下,您可以恢复使用 Core 并使用 tbl.insert().prefix_with('OR IGNORE'),例如。
  • @Ilja Everilä:就我而言,这是个坏主意,因为我正在使用 ORM。

标签: python mysql python-2.7 sqlite sqlalchemy


【解决方案1】:

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

假设您的 [ID, name] 列表中有一个重复的 John:

ls = [[1,"John"], [2,"Mary"], [3,"Jude"], [4,"John"]]

所以 John 是重复的,您只想保留第一个 'John' 值。 你要做的是:

  1. 浏览列表
  2. 将名称作为键存储在字典中。键值对为:"name": 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)

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2011-03-09
    • 2017-08-03
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多