Как узнать, какая запись не удалась в транзакции массового обновления Postgres

Эта проблема

Я должен обновить несколько записей R1, R2, ..., Rn в базе данных Postgres с использованием sqlalchemy. Операция должна быть атомарной; т.е. если Ri Сбой всей транзакции должен быть откат.

Код выглядит примерно так:

try:
    for instance_id in payload:
        instance = get_or_404(instance_id)
        sql = build_sql_for_patch(instance, payload)
        db.session.add(sql)
    db.session.commit()
except Exception:
    db.session.rollback()
    raise ValueError(...)

В случае ошибок, я хотел бы вернуть сообщение, подобное этому:

{
   "errors": [
      {"record": 1, "reason": "Something is wrong with record 1."},
      {"record": 4, "reason": "Something is wrong with record 4."},
      ...
   ]
}

Вопрос

Есть ли способ получить ошибки транзакции Postgres с такой гранулярностью? В идеале я хотел бы получить ошибку для каждой неудачной записи. Если это невозможно, я хотел бы получить номер записи, которая не работает, с соответствующим сообщением об ошибке.

0 ответов

Другие вопросы по тегам