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

Rbo*_*ery 5 python sqlalchemy

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

我见过的最接近的问题在这里:SQLAlchemy -批量插入忽略:“重复条目”;然而,接受的答案建议不要使用批量方法并在每行插入后提交,这非常慢并且会导致大量的 I/O,所以我正在寻找更好的解决方案。

小智 2

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

然后我总是做的是使用字典或列表在 Python 中围绕它编写代码。例如,技巧是在字典中将键和值设置为相同的键数据。IE

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()
Run Code Online (Sandbox Code Playgroud)

这并不是解决实际问题,而是目前的一种解决方法。此解决方案的关键是您实际上已经清除(delete_all)数据库或从任何内容开始。否则,当您已经拥有数据库时,代码仍然会失败。

为此,我们需要类似 SQLAlchemy 中的参数来忽略 add_all 上的重复,或者它们应该提供 merge_all。