Jak skutecznie wykonać zbiorcze wstawianie lub aktualizowanie za pomocą SQLAlchemy?

Używam SQLAlchemy z zapleczem Postgres, aby wykonać zbiorcze wstawianie lub aktualizację. Aby spróbować poprawić wydajność, próbuję zatwierdzać tylko raz na tysiąc wierszy:

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

Jednak to nie działa. Wydaje się, że gdy INSERT nie powiedzie się, pozostawia rzeczy w dziwnym stanie, który uniemożliwia AKTUALIZACJĘ. Czy automatycznie wycofuje transakcję? Jeśli tak, czy można to zatrzymać? Nie chcę, aby moja cała transakcja wycofała się w przypadku problemu, dlatego staram się uchwycić wyjątek.

Komunikat o błędzie, który otrzymuję, BTW, to „sqlalchemy.exc.InternalError: (InternalError) bieżąca transakcja jest przerywana, komendy ignorowane do końca bloku transakcji”, a dzieje się to w wywołaniu update (). Execute ().

questionAnswers(2)

yourAnswerToTheQuestion