2017-09-01 47 views
0

我克隆了一个postgres分贝,并为其中一个应用程序添加了一个新模型。我们的项目包含很多应用Django迁移为一个克隆分区

现在当我运行migrations时,migrate它会失败。所以我评论说,模型出来了,从文件夹中删除了migrations.py文件并且运行了伪造的迁移。再次将该模型放入并运行migrationsmigrate。事情很好。

但是现在我手动从db中删除了这个模型表,并且在运行迁移时它将显示模型不存在。

基本上我需要一次又一次地调整模型,删除,更新表。 所以我搜索了从头开始迁移。从django_migrations表中删除了一些应用程序。但它没有解决它显示已经存在的关系。

这一切都变得扑朔迷离,--fakedelete,squash该怎么办?

基本上,如果我删除表django_migrations,从应用程序删除migrations文件夹。不能django自动同步数据库,并了解什么样的模式存在和不存在,并找出它本身。

+0

重做克隆。无需执行其他任何操作,请运行迁移。你碰到什么错误?这对了解至关重要。只是试图解决它,让你陷入更多麻烦,正如你发现的那样。 – Melvyn

+0

无论如何没有再次克隆,这将意味着一次又一次的克隆。此外它需要管理员权限,邮件链等。 – garg10may

+0

不,它不。关键问题是要确定您的代码库是否与您的克隆一致。请注意,我说“运行迁移”,而不是“运行makemigrations,然后运行迁移”。只迁移。这确保您的代码库和克隆同步。也不完全确定你的最终目标是什么?为什么要手动从数据库中删除表格? – Melvyn

回答

1

如果你想创建一个Django数据库的克隆,但没有数据,那么有一张表应该总是从django_migrations获取数据。这是保存数据库状态的表格:已经应用了哪些迁移,因此已经存在哪些模型。

Django试图创建一个它是核心模型的事实告诉我,您没有克隆中django_migrations的数据。

0

这解决了这个问题。

  • 删除'django_migrations'表中的所有数据。
  • 删除了所有迁移文件夹中的所有迁移文件在不同的应用程序
  • 注释掉其表仍然没有在数据库
  • python manage.py makemigrations
  • python manage.py migrate --fake
  • 把评论关模式模型
  • ran python manage.py makemigrations
  • ran python manage.py migrate

这是要了解makemigrationsmigrate做什么。然后您可以手动删除/更新或创建新模型并迁移/克隆等等。对于新手来说,这些命令不会让人困惑。

让我们说一切都是空的,即应用程序的迁移文件夹中没有文件。 比makemigrations使这些文件包含说sqls /语法关于如何创建您的表。随着每次更改,它将创建一个新的,只有在此列出的变化。

migrate在数据库中创建实际的空表。然后在django_migrations中针对该模型所属的应用程序创建一个条目。该条目告诉它何时将该文件的最新条目应用于数据库。

场景1: 我从db中手动删除了一个表。现在django不知道这件事。所以如果你运行makemigrationsmigrate它不会做任何事情。

方案2: 我删除了所有条目从django_migrations,从应用中删除migrations文件。表格仍然在分贝。现在,当我做makemigrations它的作品,但是当我迁移它抛出错误已经存在。

方案3:django_migrationsmigration文件删除的条目。 Django有一个选项migrate --fake,这告诉它表已经存在表只需在django_migrations表中进行输入。所以makemigrationsmigrate --fake现在工作没有错误。但现在我手动删除的表格仍然被删除,django没有做到。所以当我尝试访问它时会抛出错误。

情景4: 我在开始描述的那个。我伪造了db中的条目,然后迁移了不在db中的模型。

所以一旦明白它在幕后做了什么,可以采用很多方法,手动创建表格模式或选择性地选择django_migrationsmigrations文件条目并删除它们。但最好是删除所有内容并从头开始。

django最好能理解这些表格已经创建好了,这些都是我的模型,创建了缺失的模型,离开了现有的模型。如果有差异显示他们。我看到很多与移民有关的问题,人们在这里和那里都感到困惑。