Django 迁移:关系已存在

3
我在django模型迁移方面遇到了问题。 我有一些应用程序中的模型,并且已经存在一些数据。 当我在我的应用程序中添加了一些模型并运行makemigrations时,应用程序报告没有更改。 我知道有时候迁移时会出现一些错误,所以我删除了数据库中的django_migrations表并再次运行makemigrations,现在程序找到了我的新字段。
现在的问题是,如果我运行migrate,系统会告诉我有一些表已经存在(这是正确的,因为它们确实存在)。我不想删除那些表,因为我已经有数据了。
我不能运行migrate --fake,因为程序会认为我已经有所有的表,这是不正确的。
因此,我正在寻找一种方法来告诉程序:运行迁移,如果表已经存在,则跳过它(--fake)。
另一个问题是为什么会发生这种情况,即makemigrations无法识别我的更改(可能是一些缓存问题等)?

请查看--fake-initial选项。 - Alasdair
5个回答

21

这样做怎么样?

python manage.py makemigrations

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

它将为该包创建迁移,例如 0001_initial.py。

手动编辑文件,删除除数据库中已创建的模型之外的所有模型。

现在进行虚拟迁移。 这将同步您的数据库与模型。

python manage.py migrate --fake

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

python manage.py makemigrations

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

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

1
每次您对模型进行更改时,请尝试执行以下步骤:
python manage.py makemigrations [your app name]

然后:
python manage.py migrate

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

website         = models.URLField(blank=True)

0
可能的原因是您在相同文件夹中有另一个以相同前缀开头的迁移...也许您在另一个分支或提交上对同一张表进行了另一个迁移,因此它以相同的前缀保存到数据库中,例如:00010_migration_from_commit_#10、00010_migration_from_commit_#11。
解决方案是将迁移文件重命名为00011_migration_from_commit_#11。

0

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


0
主要问题是现有的表格阻止了新表格的迁移,因此解决方案很简单:
** 尝试将 managed = False 添加到现有的数据库中,这样它就不会被 migrate 检测到
** 对所有现有旧表格重做此操作:
class Meta:
    managed=False

有时候,当一个应用程序中有许多表格时,会感到无聊,但它完美地发挥了作用!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接