Django, Postgresql & IntegrityErrors - PullRequest
       5

Django, Postgresql & IntegrityErrors

3 голосов
/ 18 ноября 2011

Я пришел из фона MySQL, где, если я хочу вставить запись, я могу использовать команду INSERT IGNORE, чтобы я мог просто вставить строки, а если есть конфликт, просто проигнорировать его.

Теперь, спроект Django, над которым я работаю, я использую postgresql и выполняю несколько сохранений в цикле.Тем не менее, я думаю , если я получаю IntegrityError (которую я игнорирую, см. Код ниже), то я теряю множество объектов, которые пытаюсь вставить ... как мне это исправить:

for thing in things:
    try:
        #potentially dangerous save..
        obj = Thing(stuff=10)
        obj.save()
    except IntegrityError:
        pass

Если, скажем, на 5-м цикле происходит цикл IntegrityError, какие объекты будут вставлены в БД?

Ответы [ 2 ]

8 голосов
/ 18 ноября 2011

Это будет зависеть от того, как вы управляете своей транзакцией.

На Postgres, если один из запросов в транзакции завершится неудачно, все последующие запросы также завершатся с ошибкой «текущая транзакция отменена, запросы игнорируются до конца блока транзакции».

Чтобы справиться с этим, вы должны использовать транзакцию.savepoint_rollback в блоке исключений.

Пожалуйста, обратитесь к Django doc Обработка исключений в транзакциях PostgreSQL

Это дает следующий пример

a.save() # Succeeds, and never undone by savepoint rollback
try:
    sid = transaction.savepoint()
    b.save() # Could throw exception
    transaction.savepoint_commit(sid)
except IntegrityError:
    transaction.savepoint_rollback(sid)
c.save() # Succeeds, and a.save() is never undone
1 голос
/ 18 ноября 2011

Не игнорируя ошибки?

Код, который вы написали, работает примерно так:

You:    Save all the things.
Django: You're about to violate data integrity in your database.
You:    I don't care.
Django: I can't simply corrupt your data. I'll just throw away 
        the things that would corrupt your data.
You:    That's what I wanted.

Хотя это может подходить для некоторых приложений, оно не подходит для большинства.

Вам просто нужно решить, что вы должны делать с данными, которые нарушают ваши ограничения целостности, и вам нужно исправить код, позволяющий неверным данным попасть в метод save ()на первом месте.Документация по Проверка формы и поля может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...