Django迁移:关系不存在
Posted
技术标签:
【中文标题】Django迁移:关系不存在【英文标题】:Django migrations: relation does not exist 【发布时间】:2017-07-01 06:43:20 【问题描述】:我的开发服务器上有一个工作站点和数据库,我正在尝试在实时服务器上进行设置。我正在执行以下操作:
Git 将存储库从开发服务器克隆到实时服务器 在实时服务器 (Posgres) 上创建空数据库 在实时服务器上更新 settings.py 以获取所有相关数据库等设置 删除所有迁移文件/文件夹并删除所有 *.pyc 文件 python manage.py makemigrations我收到错误:django.db.utils.ProgrammingError: relation "myapp_mytable" does not exist
。
我似乎无法进行初始迁移。我找到的唯一解决方案是进入我的settings.py
文件并注释掉我在INSTALLED_APPS
中的所有应用程序,然后进入我的主urls.py
文件并注释掉我所有的网址。
注释掉这些部分后,我可以进行初始迁移。之后我可以取消注释我的应用程序并开始一个一个地迁移它们,即:python manage.py makemigrations appname
然后python manage.py migrate
所以我有一个解决方法,但它远非理想。当然有一种方法可以告诉 django 我已经创建了一个全新的空数据库,所以它需要先进行初始迁移。我正在使用 Ansible 自动设置服务器,因此要求我执行所有这些手动注释/取消注释和多次迁移并不好。
更新:
根据 cmets,我不认为要删除迁移。因此,我在开发服务器上执行了以下操作来尝试重新创建它们:link。但是,即使我现在有已复制到实时服务器的迁移文件,当我尝试运行它们时,我也会收到与上述相同的错误。
我已通读迁移文件,但没有看到任何提及创建初始迁移/数据库架构的内容。它只提到创建我的应用模型。在完成应用程序迁移之前,我似乎无法弄清楚如何进行初始迁移。我需要以某种方式从头开始重新创建所有迁移文件(包括创建初始数据库架构),以便它们可以在服务器上运行。
【问题讨论】:
为什么你会删除所有的迁移文件?重点不是这样做,而是运行您已经创建的那些。 好吧,我显然误解了如何去做。我的印象是我需要在新服务器上运行 makemigrations 以便 django 看到它是一个空数据库并创建新数据库。显然我误解了。不知道为什么一个完全有效的问题应该被否决。那问一个问题有什么意义。原始问题已更新。 由于您的代码在 git 中,您应该将状态重置为迁移所在的位置,而不是重新创建它们。而且我不确定“如何在应用程序迁移之前进行初始迁移”是什么意思 - 没有单独的“初始迁移”。 我所说的“初始迁移”是因为即使我现在使用正确的迁移文件运行 manage.py migrate,我仍然会收到相同的错误,说关系不存在。数据库是空的,所以当然关系还不存在。我不确定为什么 django 没有创建所有必需的模型。 您似乎在某处进行了导入,导致在进程启动时进行数据库查询。您应该发布完整的回溯以帮助追查问题。 【参考方案1】:感谢 cmets 中的@Daniel Roseman,我最终解决了这个问题。我正在做以下事情:
list(Correlation().get_entries())
这样做是创建一个模型实例(即:相关性)并针对它调用 get_entries() 方法。然后我将它包围在 list() 中。出于某种原因,这阻止了迁移工作。我删除了无论如何都不需要的 list(),现在一切正常。
【讨论】:
以上是关于Django迁移:关系不存在的主要内容,如果未能解决你的问题,请参考以下文章
django.db.utils.ProgrammingError:关系“users_user”不存在
Django ProgrammingError:在 Django 源代码中创建迁移后,关系已经存在?