创建新表时,Django迁移失败

时间:2019-06-12 16:52:17

标签: django django-models

我们对Django来说还很陌生。我们有一个应用程序和一个模型。我们想在模型中添加一个“类别”对象。我们这样做了,然后运行了“ python manage.py makemigrations”。

然后,我们将代码部署到运行旧代码的服务器上,并运行“ python manage.py migration”。这将引发2页异常,并以'django.db.utils.ProgrammingError:(1146,“表'reporting.contact_category'不存在”)结尾”

这似乎是在查看我们的models.py。如果我们从模型及其所有引用中注释掉Category,则迁移成功。

我认为迁移的重点是使数据库与模型期望的匹配,但这似乎要求模型在迁移之前与数据库匹配。

我们显然在做错事,但是怎么办?

2 个答案:

答案 0 :(得分:1)

我相信您跳过了服务器中的某些迁移,因此现在您缺少一些表(我一直处于这种情况。请确保 migrations 目录位于您的 .gitignore 上。您无法检入迁移文件,必须在服务器上运行makemigrations。这可以通过追溯到数据库和模型文件匹配的点来解决,但是如果这是您的生产数据库,则这是一个冒险的过程,因此您应先进行完整备份,然后再在另一台计算机上尝试该过程。

这是我的建议:

  1. 从服务器删除迁移文件。
  2. 注释引起错误的模型。
  3. 将服务器的迁移历史记录设置为 数据库使用python manage.py makemigrationspython manage.py migrate --fake-initial(这将更新迁移文件,而无需实际尝试修改数据库)。
  4. 取消注释引发错误的模型。
  5. 运行python manage.py makemigrationspython manage.py migrate

如果在注释引发异常的模型之后,又得到了另一个异常,则必须继续注释并再次尝试。迁移成功后,您可以取消注释所有注释的模型并进行实际迁移。

答案 1 :(得分:0)

如果您对python manage.py makemigrations进行了更改,请记住运行models.py,然后运行python manage.py makemigrations

两个命令必须必须在具有相同数据库的同一服务器上运行