Django迁移:关系不存在

18

我正在尝试在Django应用程序上运行初始迁移,但当我尝试运行迁移命令(python manage.py migrate或makemigrations)时,出现以下错误:

psycopg2.ProgrammingError: relation "dotworks_server_internship" does not exist
LINE 1: ...s", "dotworks_server_internship"."questions" FROM "dotworks_...
                                                             ^

我在使用Django 1.9.6和Postgres数据库的Windows环境下,同时使用PGAdmin来管理我的数据库。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'dotworks',
        'USER': 'postgres',
        'PASSWORD': 'mypasswordgoeshere',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
11个回答

26

我遇到了这个问题,不得不将 urls.py 中所有引用 views.py 的内容注释掉,然后运行 makemigrations


11
当你运行 python manage.py makemigrations 时,它似乎会检查 urls.py(在我的情况下是 urls_tenanats.py),并尝试在数据存在之前执行 SQL 来读取模型数据。当我运行 makemigrations 时,它会在第一个模型上失败,并显示关系 XXX 不存在的错误。我注释掉了 urls.py 中引用 views.py 的代码,然后 makemigrations 就可以正常工作了。 - Mattchoo
1
这是一个非常奇怪的陷阱,在任何地方似乎都没有记录!再次受益于 Stack Overflow,节省了数小时的时间。 - Homunculus Reticulli

15

请确保您的代码中没有调用Django manager的任何类变量。

例如:

class SomeViewSet(viewsets.ViewSet):
    se = SomeEntity.objects.first()  # fetching some entity on the class level

    def list(self, request):
    # the rest of the code

因此,当您尝试创建/应用迁移时,此变量也将尝试初始化,并尝试访问SomeEntity,但此时该实体甚至不存在,从而导致错误发生。


1
这是正确的答案。 - MarMat

3

如果其他提到的解决方法都失败了,如果您仍在开发中,可能最简单的解决方法是删除数据库(在pgAdmin 4 2.0中,右键单击数据库),然后运行makemigrationsmigrate


如果你正在处理生产数据库,那该怎么办呢?可以直接删除吗? - undefined

3

尝试使用以下过程迁移特定的应用程序。请参阅Django 迁移

python manage.py makemigrations

首先创建迁移,然后使用应用程序名称运行迁移命令

python manage.py migrate appname1, appname2

2
当您在应用迁移之前运行查询时,会出现此错误。
如果您在执行python manage.py makemigrationspython manage.py migrate命令期间遇到此错误,则必须考虑makemigrationsmigrate命令是在django引导成功后运行的!因此,在django引导期间运行查询时会出现此错误!因此,您必须找到在引导进程期间运行此查询的位置。
例如,在引导期间,django会读取根{project}/urls.py及其嵌套导入。如果您在urls.py中使用视图或视图集,并且它们在初始化期间运行查询(在其__init__方法或__init__.py文件或其他地方等),那么就会发生这种情况!
在这种情况及类似情况下,您必须注释掉urls.py和类似文件中的任何条目,这些条目会在引导期间运行查询,并通过在引导期间抛出异常来防止它们运行!makemigrationsmigrate需要成功引导才能运行!
如果您注释掉的代码需要makemigrationsmigrate手工操作,那么它需要耐心等待一段时间;)在成功迁移后,它可以变得活跃和详细;D。

1

Django正在运行可选检查。在调用manage.py时传递--skip-checks标志。


1
你的应用程序正在试图调用一些不存在的数据库条目。 如果你想将它迁移到一个新的数据库,你可以选择导出旧数据库的转储文件并将其导入到新的数据库中

例如,在PostgreSQL中,使用下面的命令导入数据库,然后迁移就会成功!
sudo -u postgres -i psql mydb < mydb-export.sql

0

这个错误可能与之前的数据库错误有关。因此,如果您创建了一个新的数据库,也遇到了这种类型的错误,您可以简单地使用应用程序名称运行命令:

python manage.py makemigrations <"app name">
python manage.py migrate <"app name">

0

如果您正在本地运行, 对于每个Django应用程序(也许您只有一个),请删除migrations文件夹的内容。 然后,运行python manage.py makemigrations app1 app2 app3(如果您有3个名为app1、app2、app3的Django应用程序)。这将(重新)创建迁移文件以迁移您的数据库。

然后,运行python manage.py migrate。它将应用您刚刚创建的迁移文件。


2
无法工作,问题似乎是第一次迁移尝试未能创建表格。 - Miguel Machado

0

对我来说,错误来自于我放在app.ready()方法中的一些初始化代码。注释掉那部分代码可以让我在运行makemigrations命令时没有任何问题。

我相信manage.py在执行makemigrations命令时会在某个时候调用app.ready,这导致我的代码在任何迁移之前查询了我的数据库。

我通过traceback找到了有问题的代码。


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