У меня есть сценарий импорта, который запускает ряд команд, чтобы получать вещи из одной базы данных Postgres в другую, обе работают с той же кодовой базой Django. По большей части он использует ./manage.py loaddata для копирования, но некоторые объекты требуют дополнительной обработки, и я использую метод objects.create() Django в пользовательском скрипте для копирования данных. При этом, я указать идентификатор, то есть,Создание объекта Django и последовательности Postgres
MyObject.objects.create(id = 2, title = 'foo')
После того, как скрипт будет сделано, я заметил, что ПОСЛЕДОВАТЕЛЬНОСТЬ Postgres неправильно на столах, где я сделал objects.create(). I., это было 50 до импорта, а еще 50 после, хотя в таблице теперь 150 объектов. Это, конечно, приводит к ошибкам при создании новых объектов, поскольку он пытается использовать уже существующий ID (во всех этих таблицах идентификатор является просто полем автоматического увеличения числа ванили). Однако таблицы, заполненные с помощью ./manage.py loaddata, выглядят нормально.
Я знаю, что я могу вручную сбросить эти таблицы с помощью ./manage.py sqlsequenreset Django. Но мне любопытно, почему последовательность, кажется, выходит из-под удара в первую очередь. Не увеличивает ли object.create() его? Я не замечаю ничего очевидного?
нет лучших способов синхронизации базы данных? Вы проверяли структуру таблицы об автоматическом добавлении в поле id? – Prashanth
Я не в курсе событий, связанных с postgres, но я предполагаю, что всякий раз, когда строка вставляется с «нулем» для столбца идентификации, она получает «заполняется» postgres (a la auto_increment) и последовательность увеличивается. Если вы укажете идентификатор самостоятельно, он обходит эту логику и просто вставляет строку напрямую. Я думаю, что django не пытается фактически увеличить порядковый номер, оставив его в базе данных. – shylent
@shylent Я тоже летаю на интуиции, но, похоже, цель иметь переменную последовательности, увеличивающуюся в базе данных, - это не запускать max над идентификаторами для каждой записи на каждой вставке, когда идентификатор не указан , Чтобы сохранить последовательность в актуальном состоянии в случае использования OP, макс должен запускаться после каждой вставки, когда указан идентификатор. Я думаю, что оправданно требовать от пользователя вручную запросить обновление. –