Как эффективно выполнить массовую вставку или обновление с помощью 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 ().