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 ().

questionAnswers(2)

yourAnswerToTheQuestion