SQLAlchemy-批量插入忽略重复/唯一

时间:2019-05-16 15:37:42

标签: python sqlalchemy

使用Sqlalchemy对于大型数据集,我想使用诸如session.add_all()和session.commit()之类的高效方法插入所有行。我正在寻找一种忽略插入任何引发重复/唯一键错误的行的方法。问题在于这些错误仅出现在session.commit()调用上,因此没有办法使该特定行失败并移至下一行。

我所看到的最接近的问题在这里:SQLAlchemy - bulk insert ignore: "Duplicate entry";但是,可接受的答案是建议不要使用大容量方法,并且在每行插入后都提交,这非常慢并且会导致大量的I / O,因此我正在寻找更好的解决方案。

1 个答案:

答案 0 :(得分:0)

的确。 同样的问题在这里。它们似乎忘记了性能,尤其是当您有远程数据库时,这是一个问题。

然后我总是做的是使用Dictionary或List在Python中围绕它进行编码。例如,技巧就是在字典中将键和值设置为相同的键数据。 即

myEmailAddressesDict = {}
myEmailList = []
for emailAddress in allEmailAddresses:
    if emailAddress not in myEmailAddressesDict:
        #can add
        myEmailList.append(emailAddress)
        myEmailAddressesDict[emailAddress] = emailAddress
mySession = sessionmaker(bind=self.engine)
try:
    mySession.add_all(myEmailList)
    mySession.commit()
except Exception as e:
    print("Add exception: ", str(e))
mySession.close()

这不是解决实际问题的方法,而是目前的一种解决方法。此解决方案的关键在于,您实际上已经清除(delete_all)数据库或什么都不做。否则,当您已经有一个数据库时,代码仍然会失败。

为此,我们需要像SQLAlchemy中的参数之类的东西来忽略add_all上的重复项,否则它们应该提供merge_all。