Toplu ekleme veya güncelleştirme yapmak için SQLAlchemy'yi bir Postgres arka uç kullanarak kullanıyorum. Performansı artırmaya çalışmak için, her bin satırda bir veya daha fazla işlem yapmaya çalışıyorum:SQLAlchemy ile toplu ekleme veya güncelleştirme işlemlerini verimli bir şekilde nasıl yapabilirim?
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()
Ancak, bu çalışmaz. Görünen o ki, INSERT başarısız olduğunda, UPDATE'in gerçekleşmesini engelleyen garip bir durumda bir şeyler bırakıyor. İşlemi otomatik olarak geri alıyor mu? Eğer öyleyse, bu durdurulabilir mi? Tüm işlemimin bir sorun olması durumunda geri dönmesini istemiyorum, bu yüzden ilk başta özel durumu yakalamaya çalışıyorum.
Hata alıyorum, BTW, "sqlalchemy.exc.InternalError: (InternalError) geçerli işlem iptal edilir, işlem bloğu bitinceye kadar yoksayılır komutlar", ve bu güncelleştirme() olur.) aramak.
"Bir işlemde bir hata oluşursa, tüm işlemin geri alınmasına zorlanır. Bunu bir Postgres tasarım hatası olarak kabul ediyorum." - İşlemlerin amacı bu değil mi? [Wikipedia] 'dan (http: //en.wikipedia.org/wiki/Database_transaction): "İşlemler, bir veritabanında gerçekleştirilen her bir iş biriminin tamamen tamamlanmasının veya herhangi bir etkisinin olmaması gerektiğini belirten bir" tamamen ya da hiçbir şey "önermesi sağlar." – spiffytech
@Spiffytech İyi yanıt. Bu aslında beni LOL yaptı. –