Как эффективно выполнить массовую вставку или обновление с помощью SQLAlchemy?

Я использую SQLAlchemy с бэкэндом Postgres, чтобы выполнить массовую вставку или обновление. Чтобы улучшить производительность, я пытаюсь зафиксировать только один раз каждые тысячи строк:

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

Тем не менее, это не работает. Кажется, что когда INSERT терпит неудачу, это оставляет вещи в странном состоянии, которое предотвращает ОБНОВЛЕНИЕ. Это автоматически откат транзакции? Если это так, можно ли это остановить? Я не хочу, чтобы вся моя транзакция откатывалась в случае возникновения проблемы, поэтому я пытаюсь поймать исключение в первую очередь.

BTW, я получаю сообщение об ошибке: «sqlalchemy.exc.InternalError: (InternalError) текущая транзакция отменена, команды игнорируются до конца блока транзакции», и это происходит при вызове update (). Execute ().

Ответы на вопрос(2)

Ваш ответ на вопрос