Wie kann ich mit SQLAlchemy ein Bulk-Insert oder -Update durchführen?

Ich verwende SQLAlchemy mit einem Postgres-Backend, um ein Bulk-Insert oder -Update durchzuführen. Um die Leistung zu verbessern, versuche ich, etwa alle tausend Zeilen ein Commit durchzuführen:

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

Dies funktioniert jedoch nicht. Wenn das INSERT fehlschlägt, bleiben die Dinge in einem seltsamen Zustand, der das UPDATE verhindert. Wird die Transaktion automatisch zurückgesetzt? Wenn ja, kann dies gestoppt werden? Ich möchte nicht, dass meine gesamte Transaktion im Falle eines Problems zurückgesetzt wird. Deshalb versuche ich zunächst, die Ausnahme zu erkennen.

Die Fehlermeldung, die ich übrigens erhalte, lautet "sqlalchemy.exc.InternalError: (InternalError) Die aktuelle Transaktion wird abgebrochen. Befehle werden bis zum Ende des Transaktionsblocks ignoriert." Dies geschieht beim Aufruf von update (). Execute ().

Antworten auf die Frage(2)

Ihre Antwort auf die Frage