Django 迁移:关系已经存在

Django migrations : relation already exists

我在 Django 模型迁移方面遇到了问题。 我的应用程序中有一些模型,并且内部已经有一些数据。 当我在我的应用程序中添加一些模型时,我 运行 makemigrations,应用程序报告没有变化。 我知道迁移时有时会出现一些错误,所以我删除了数据库中的 django_migrations table 并再次删除了 运行 makemigrations,现在程序找到了我的新字段。

现在的问题是,如果我 运行 migrate 系统告诉我一些 table 已经存在。 (这是正确的,因为他们这样做了)。我不想删除那些 table,因为我已经有数据在里面了。

我不能运行 migrate --fake,因为程序会认为我已经有所有 table,这不是真的。

所以,我正在寻找一种方法来告诉程序:运行 迁移,如果 table 存在则跳过它。 (--fake吧)

另一个问题是为什么我会发生这种情况,makemigrations 无法识别我的更改(一些缓存问题,...)?

这样做怎么样?

python manage.py makemigrations

(如果您已经准备好迁移文件,请跳过此步骤)

它将为那个包创建迁移让我们说名字像 0001_initial.py

手动编辑文件,以便删除其中的所有模型,但已在数据库中创建的模型除外。

现在你做一个假迁移。这会将您的数据库与模型同步。

python manage.py migrate --fake

然后 运行 再次 makemigrations 以创建其余表以及新的迁移文件。

python manage.py makemigrations

关于您的另一个问题,为什么 makemigrations 没有识别您的模型可能是因为以下原因:

  1. 这些更改的迁移已存在于某些迁移文件中。
  2. 你错过了在 INSTALLED_APPS 中提到 package_name 但我相信你在这里做到了。

每次更改模型时,请尝试以下步骤:

python manage.py makemigrations [your app name]

然后:

python manage.py migrate

它应该可以正常工作。但请记住,如果您的表中已经有数据(行),您应该为每个查询指定默认值。
如果没有,Django 会提示你为它们指定默认值 或者您可以尝试在您的字段中使用 blank=Truenull=True,如下所示:

website         = models.URLField(blank=True)

可能的原因是您在同一个文件夹中有另一个迁移以相同的前缀开始...也许您在另一个分支上的同一个 table 上进行了另一个迁移或提交,所以它被保存到具有相同前缀的数据库,即:00010_migration_from_commit_#10,00010_migration_from_commit_#11

解决方法是像这样重命名迁移文件00011_migration_from_commit_#11

我尝试编辑相关的迁移文件并评论了创建该特定列的部分,然后 运行 python manage.py migrate

主要问题是现有表禁止迁移新表,因此解决方案很简单:

** 尝试将 managed = False 添加到现有的 dB,这样它就不会被 migrate

检测到

** 对所有现有的旧表重做:

class Meta:
    managed=False

当我们在同一个应用程序中有很多表时,有时会很无聊,但它工作得很好!