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

4
使用Sqlalchemy处理大数据集时,我想使用像session.add_all()这样有效的方式插入所有行,然后使用session.commit()。我正在寻找一种忽略插入任何引发重复/唯一键错误的行的方法。问题在于,这些错误仅在session.commit()调用时出现,因此无法使特定行失败并继续下一个。
我看到的最接近的问题在这里:SQLAlchemy - bulk insert ignore: "Duplicate entry";但是,被接受的答案建议不使用批量方法,并在每个单独的行插入后提交,这非常慢并且会导致大量的I/O,因此我正在寻找更好的解决方案。
1个回答

1

确实。 我也遇到了同样的问题。他们似乎忘记了性能,尤其是当您使用远程数据库时,这是一个问题。

我通常会在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中的参数来忽略添加重复项,或者他们应该提供一个merge_all函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接