【问题标题】:Django migrations : relation already existsDjango迁移:关系已经存在
【发布时间】:2018-04-07 17:21:18
【问题描述】:

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

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

我无法运行migrate --fake,因为程序会认为我已经拥有所有表,这是不正确的。

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

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

【问题讨论】:

标签: django postgresql migrate makemigrations


【解决方案1】:

这样怎么样?

python manage.py makemigrations

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

它将为该软件包创建迁移,可以说是 0001_initial.py 之类的名称

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

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

python manage.py migrate --fake

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

python manage.py makemigrations

关于您的其他问题,为什么 makemigrations 无法识别您的模型可能是因为以下原因:

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

【讨论】:

    【解决方案2】:

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

    python manage.py makemigrations [your app name]
    

    然后:

    python manage.py migrate
    

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

    website         = models.URLField(blank=True)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          class Meta:
              managed=False
          

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

          【讨论】:

            猜你喜欢
            • 2015-09-01
            • 2015-04-28
            • 2013-02-04
            • 2012-09-18
            • 2023-03-08
            • 2018-10-06
            • 2012-03-11
            • 2019-11-17
            • 2017-07-01
            相关资源
            最近更新 更多