PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Кои специфични изключения представляват неуспешна сериализация, когато Django използва ниво на изолация на сериализуема транзакция с postgresql?

Хм, добър въпрос. Документацията предполага, че подходящото изключение би било TransactionManagementError :

Обаче изходният код дава силна представа, че не е:

class TransactionManagementError(ProgrammingError):
    """Transaction management is used improperly."""
    pass

Имайте предвид, че това е ProgrammingError , което наистина се използва за указване на програмна грешка (т.е. „използвано неправилно“).

Ако погледнем документацията за psycopg (адаптерът на Python, използван за поддръжка на PostgreSQL), ще видим, че той ще предизвика psycopg2.extensions.TransactionRollbackError :

Но какво прави Джанго с това? Е, както документирано тук , той обвива стандартните Python DB API 2.0 изключения в Django еквиваленти и задава __cause__ атрибут към оригиналното изключение. Така че следното вероятно е най-конкретната проверка, която можете да направите:

from django.db import OperationalError
from psycopg2.extensions import TransactionRollbackError

for retries in range(0, 3):
    try:
        with transaction.atomic():
            MyModel.objects.update(foo='bar')
    except OperationalError as e:
        if e.__cause__.__class__ == TransactionRollbackError:
            continue
        else:
            raise            
    else:
        break

В зависимост от подробностите за грешката, изложени от PostgreSQL (достъпни чрез e .__cause__.diag ) може да е възможно да напишете още по-специфичен тест.

Като цяло обаче документацията на Python DB API 2.0 посочва, че OperationalError наистина е правилният тип изключение за проблеми с транзакциите, така че да се надяваме, че улавянето ще бъде сравнително ефективно решение за агностик на база данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте двоична таблица COPY FROM с psycopg2

  2. Получаване на грешка:Трябва да инсталирате поне един пакет postgresql-client-<версия> при внедряване в heroku

  3. Entity Framework Core jsonb тип колона

  4. Статистика за покритието на кода

  5. Postgresql таблици съществуват, но получаването на релация не съществува при запитване