Sto utilizzando SQLAlchemy con un backend Postgres per eseguire un inserimento o aggiornamento di massa. Per provare a migliorare le prestazioni, sto tentando di eseguire il commit solo una volta ogni mille righe o così:Come faccio a fare un inserimento o aggiornamento di massa con 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()
Tuttavia, questo non funziona. Sembra che quando l'INSERT fallisce, lascia le cose in uno stato strano che impedisce che l'UPDATE accada. Sta automaticamente ripristinando la transazione? Se è così, può essere fermato? Non voglio che la mia intera transazione venga annullata in caso di problemi, ed è per questo che cerco di cogliere l'eccezione in primo luogo.
Il messaggio di errore che sto ottenendo, BTW, è "sqlalchemy.exc.InternalError: (InternalError) la transazione corrente viene interrotta, i comandi ignorati fino alla fine del blocco della transazione) chiamata.
"Se si verifica un errore in una transazione, impone il rollback dell'intera transazione. Lo considero un bug di progettazione Postgres." - Non è questo il punto delle transazioni? Da [Wikipedia] (http: //en.wikipedia.org/wiki/Database_transaction): "Le transazioni forniscono una proposizione" tutto o niente ", affermando che ogni unità di lavoro eseguita in un database deve essere completa nella sua interezza o non avere alcun effetto". – spiffytech
@Spiffytech Buona risposta. Questo in realtà mi ha fatto LOL. –