Ситуация
У меня есть приложение django (использующее postgres в качестве базы данных), работающее в производстве.Я пытаюсь измерить / улучшить производительность, и я хотел бы сделать это, скопировав данные из производственного экземпляра (который обладает лучшими данными по количеству и качеству) на мой локальный компьютер, и запустить сервер локально,Я копирую папку Postgres
, из которой работает БД на рабочей машине, на мой локальный компьютер (используя scp
), и запускаю БД из этой теперь локальной папки и с моего локального сервера django.Функционально, я могу взаимодействовать с приложением совершенно нормально, без проблем.Однако, как только я изменяю свои модели, генерирую миграцию и пытаюсь выполнить миграцию (опять же, на эту локальную версию), я получаю ошибки:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_model_<HASH>_uniq"
DETAIL: Key (app_label, model)=(<APP_NAME>, <CONTENT_TYPE>) already exists.
<APP_NAME>
и <CONTENT_TYPE>
- это конкретные названия приложения и тип контента для моего приложения.content_type
- это тип, который долгое время существовал в базе данных и не влиял на изменение / миграцию моей модели.Когда я говорю, что приложение «в целом работает нормально» в предыдущем абзаце, я имею в виду, что могу получить данные, относящиеся к этому типу контента, без проблем.
В целом, мне кажется, что записи нетлюбой из предыдущих миграций, которые составляют текущую базу данных, и, таким образом, он пытается воссоздать все эти content_type
.Насколько я понимаю, запись о предыдущих миграциях должна храниться в БД, и, поскольку я копирую весь каталог БД, я не уверен, почему он будет пытаться воссоздать эти типы данных.Что касается самой миграции, я не считаю, что это проблематично, это просто добавление индексации к нескольким столбцам в одном из классов модели.Я попытался быстро перенести его в наш экземпляр QA, а затем откатить назад, оба без ошибок.Когда я пытаюсь выполнить ту же процедуру с экземпляром QA (т. Е. Скопировать локальный каталог QA Postgres DB, чтобы попытаться запустить миграцию на БД, запущенной из этой папки, но на моем компьютере), я получаю точно такую же проблему.
Итакмой вопрос, почему он пытается воссоздать этот тип данных?Есть ли лучший способ, которым я должен копировать данные?Это кажется наиболее исчерпывающим способом, поскольку он копирует все, от данных до учетных записей пользователей, чтобы воссоздать точный сценарий, который я хотел бы оптимизировать.
Вещи, которые я пробовал
1) Синхронизация последовательностей идентификаторов базы данных: хотя я не верю, что это проблема, основанная на ошибках, которые я вижу, я попытался синхронизировать id_sequence (рекомендуется многими сообщениями SO), чтобы устранить это как возможную фоновую проблему, но длябезрезультатно.В частности, я запустил:
SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type)+1);
2) Остановка базы данных: я был обеспокоен тем, что в середине копирования происходили некоторые записи в БД, которые могли привести к потере синхронизации.Поэтому я попытался остановить базу данных во время копирования, но это, похоже, тоже не помогает.
3) Чтобы было ясно, я использовал pg_dump
, и он отлично работает, но система, которую я разрабатываю,используется в основном пользователями, которые не знакомы с базами данных, поэтому я хотел бы сделать этот процесс как можно более модульным (т. е. «просто переместить каталог данных postgres и запустить его из этой папки»)