Como faço com eficiência uma inserção ou atualização em massa com o SQLAlchemy?
Estou usando o SQLAlchemy com um back-end do Postgres para fazer uma inserção ou atualização em massa. Para tentar melhorar o desempenho, estou tentando confirmar apenas uma vez a cada mil linhas, aproximadamente:
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()
No entanto, isso não está funcionando. Parece que quando o INSERT falha, ele deixa as coisas em um estado estranho que impede que o UPDATE aconteça. É automaticamente revertendo a transação? Se sim, isso pode ser parado? Eu não quero que minha transação inteira seja revertida no caso de um problema, e é por isso que estou tentando pegar a exceção em primeiro lugar.
A mensagem de erro que estou recebendo, BTW, é "sqlalchemy.exc.InternalError: (InternalError) a transação atual é anulada, os comandos são ignorados até o final do bloco de transação" e isso acontece na chamada update (). Execute ().