我正在使用SQLAlchemy和Postgres後端來執行批量插入或更新。爲了提高性能,我試圖每千行左右只提交一次:如何有效地使用SQLAlchemy進行批量插入或更新?
trans = engine.begin()
for i, rec in enumerate(records):
if i % 1000 == 0:
trans.commit()
trans = engine.begin()
try:
inserter.execute(...)
except sa.exceptions.SQLError:
my_table.update(...).execute()
trans.commit()
但是,這是行不通的。看起來,當INSERT失敗時,它使事情處於一種奇怪的狀態,阻止UPDATE發生。它會自動回滾事務嗎?如果是這樣,可以停止嗎?我不希望我的整個事務在發生問題時回滾,這就是爲什麼我試圖首先捕獲異常。我得到的錯誤信息是「sqlalchemy.exc.InternalError:(InternalError)當前事務被中止,命令被忽略,直到事務塊結束」,並且它發生在update()。execute() )電話。
「如果在事務中發生錯誤,它會強制整個事務回滾,我認爲這是Postgres設計錯誤。」 - 這不是交易點嗎?來自[Wikipedia](http://en.wikipedia。org/wiki/Database_transaction):「交易提供了一個」全有或全無「的主張,指出在數據庫中執行的每個工作單元必須完整或完全沒有任何影響。」 – spiffytech 2014-01-11 21:47:03
@Spiffytech回覆良好。這實際上使我LOL。 – 2014-02-02 16:47:33