从Django到Postgres DB的奇怪迁移。如何保存现有数据

时间:2019-02-12 13:37:35

标签: python django database postgresql inspectdb

我走的路很奇怪,但这是环境的结果。 我必须通过inspect_db从现有的postgres DB中生成单个model.py。 接下来,我修复一些字段(密钥有一些问题),并在该项目中创建2个应用程序。因此,现在我有3个model.py(它们是splits.py,它们是由inspect_db生成的)。 managed = True已添加。类具有与数据库中相同的链接和数据类型 接下来,我希望将此模型集成到现有数据库中。我进行迁移,然后进行迁移,最后数据库中只有系统django表(auth_,django_migrations等)。我的课程中没有(尽管创建了迁移文件)。因此,我尝试删除迁移目录并重复makemigrationsmigrate,但终端将其扔了:

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表中有关我的应用程序的信息-没有结果。

所以我的问题是: -是否可以将新模型集成到现有数据库中(如果名称,键和格式还可以)? -是否可以通过迁移后保存现有数据库中数据的方式进行集成? -如何返回进行迁移的可能性?现在不起作用。

1 个答案:

答案 0 :(得分: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提供的表(authcontenttypesession等)
  6. 现在您处于可以开始进行更改的状态。如果您更改模型并运行makemigrations,则它应该只为您的更改创建迁移。