Странная миграция с django на postgres DB. Как сохранить существующие данные

Я иду странным путем, но это результат обстоятельств. Мне пришлось сгенерировать один файл models.py из существующей базы данных postgres с помощью inspect_db. Затем я исправляю некоторые поля (была небольшая проблема с ключами) и создаю 2 приложения внутри этого проекта. Итак, теперь у меня есть 3 models.py (это разделенные models.py, которые были сгенерированы inspect_db). Добавлен managed = True. Классы имеют те же ссылки и типы данных, что и в базе данных. Далее я хочу интегрировать эти модели в существующую базу данных. Я делаю миграцию, я мигрирую, и в итоге в БД есть только системные таблицы django (auth_, django_migrations и т. д.) Ни одной из моих классов (хотя файлы миграции были созданы). Итак, я попытался удалить каталоги миграции и повторить makemigrations и migrate, но терминал выдал это:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
(forest-venv) user@user-HP-Z800-Workstation ~/MyProjects/forest-venv/lesoved $ python manage.py runserver 8001
Performing system checks...

Если я попытаюсь снова выполнить миграцию - никаких изменений. Я попытался удалить информацию о своих приложениях в таблице django_migrations - безрезультатно.

Итак, мои вопросы: - Можно ли интегрировать новые модели в существующую базу данных (если имена, ключи и форматы в порядке)? - Возможна ли интеграция по способу сохранения данных из существующей базы данных после миграций? - Как вернуть возможность миграции? теперь это не работа.

Сначала вам нужно достичь состояния, в котором ваши модели и миграции соответствуют вашей базе данных. Ничего не меняйте в моделях производства inspectdb. Если ваши модели соответствуют вашей базе данных, вам следует использовать makemigrations, затем для ваших приложений запустите migrate <app> --fake, а затем migrate (для приложений django, если в вашей базе данных нет auth и т. д.). Затем вы можете начать менять модели и выполнять миграцию, как обычно.

dirkgroten 12.02.2019 15:18

@dirkgroten, так что, если я внес изменения в модель перед миграцией и миграцией, я не буду интегрировать модели в существующую базу данных?

Tyomik_mnemonic 12.02.2019 15:56

Нет, сначала вам нужно убедиться, что ваше текущее состояние миграции соответствует вашему состоянию базы данных. В противном случае вы не сможете запустить режим fake. Кстати, вы должны убедиться, что в вашей базе данных нет миграций (таблица django-migrations), прежде чем начать.

dirkgroten 12.02.2019 16:46

@dirkgroten спасибо! Итак, если я правильно вас понял, мне нужно: 1) сгенерировать inspect_db models.py; 2) не изменять этот файл models.py и делать миграцию; 3) выполнить migrate <app> --fake и выполнить миграцию целиком; 4) Затем, в конце концов, я могу разделить этот файл models.py на несколько моделей в разных приложениях моего проекта. Да?

Tyomik_mnemonic 13.02.2019 08:08

Замечательно, все работают! Спасибо @dirkgroten и документации django!

Tyomik_mnemonic 13.02.2019 10:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
789
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хитрость при использовании существующей базы данных заключается в том, чтобы убедиться, что вы начинаете с четко определенного состояния: сначала установите Django в то же состояние, что и ваша база данных, и только после этого начните вносить изменения в свои модели. Итак, вот шаги:

  1. Убедитесь, что в вашей базе данных нет таблицы django-migrations, при необходимости удалите ее с помощью SQL. (Примечание: я предполагаю, что эта база данных не создается Django для начала, и вы создаете новое приложение django)
  2. Создавайте свои модели с помощью inspectdb. При необходимости переименуйте модели, чтобы они имели правильный CamelCase. Если вы переименовываете модели или поля, которые изменят имя таблицы или столбца в базе данных, обязательно установите db_table (опции Meta вашей модели) и db_column (как атрибут поля).
  3. Запустите manage.py makemigrations. Проверьте файлы миграции для ваших моделей, просто чтобы убедиться, что имена совпадают с вашими базами данных.
  4. Для ваших собственных приложений запустите manage.py migrate <app> --fake. Это добавит миграции в таблицу django-migrations в вашей базе данных, как если бы они выполнялись, но фактически не запускали их.
  5. Затем запустите manage.py migrate, чтобы создать таблицы, предоставленные django (auth, contenttype, session и т. д.).
  6. Теперь вы находитесь в состоянии, когда вы можете начать что-то менять. Если вы измените модель и запустите makemigrations, он должен создать миграцию только для ваших изменений.

Другие вопросы по теме