使用Sqlalchemy对于大型数据集,我想使用诸如session.add_all()和session.commit()之类的高效方法插入所有行。我正在寻找一种忽略插入任何引发重复/唯一键错误的行的方法。问题在于这些错误仅出现在session.commit()调用上,因此没有办法使该特定行失败并移至下一行。
我所看到的最接近的问题在这里:SQLAlchemy - bulk insert ignore: "Duplicate entry";但是,可接受的答案是建议不要使用大容量方法,并且在每行插入后都提交,这非常慢并且会导致大量的I / O,因此我正在寻找更好的解决方案。
答案 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。