Django ORM неправильно читает последовательности PostgreSQL? - PullRequest
2 голосов
/ 02 июля 2010

Справочная информация : Запуск базы данных PostgreSQL для приложения Django (Django 1.1.1, Python2.4, psycopg2 и Postgres 8.1) Я несколько раз восстанавливал базу данных из дампа SQL. Каждый раз, когда я делаю это, а затем пытаюсь добавить новую строку, либо оболочку, либо администратора, либо интерфейс сайта, я получаю эту ошибку:

IntegrityError: duplicate key violates unique constraint "app_model_pkey"

Дамп данных в порядке и сбрасывает последовательности. Но если я попытаюсь снова добавить строку, она будет успешной! Так что я могу просто попытаться вставить новую строку в каждую таблицу, и тогда все будет как-то смешанным.

Вопрос : Учитывая, что (1) дамп SQL хорош и Postgres читает его правильно (по более раннему вопросу ), и (2) ORM Джанго, похоже, не Систематически не удается получить следующие значения, что происходит в этом конкретном случае?

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

Я предполагаю, что ваша последовательность устарела.

Вы можете исправить это так:

select setval('app_model_id_seq', max(id)) from app_model;
2 голосов
/ 05 июля 2010

Django не хранит и не читает значения последовательности напрямую.Я объяснил это, например.в этот вопрос: 2088210 / django-object-creation-and-postgres-sequence .

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

Я не знаю, почему ваши последовательности не установлены должным образом, вы можете проверить, какое значение последовательности перед сбросом и после восстановления, и сделать то же самое с max () pk таблицы?Может быть это ошибка 8.1 с восстановлением?Я не знаю.В чем я уверен: это не вина Джанго.

...