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