Django 1.8无法运行,出现django.db.utils.ProgrammingError: relation "auth_user" does not exist错误。

24

我之前使用Django 1.7创建了一个可以运行的项目,现在我将它迁移到Django 1.8上。 我可以使用SQLite进行syncdb并运行应用程序,但是当我切换到PostgreSQL时,syncdb失败了:

  Creating tables...
    Creating table x
    Creating table y
    Running deferred SQL...
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "~/venv/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 25, in handle
    call_command("migrate", **options)
  File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 120, in call_command
    return command.execute(*args, **defaults)
  File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "~/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 179, in handle
    created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "~/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 317, in sync_apps
    cursor.execute(statement)
  File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "~/venv/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: relation "auth_user" does not exist

我尝试删除数据库并重新创建它。 此外,我还尝试了:

python manage.py migrate auth

也会失败的:

django.db.utils.ProgrammingError: relation "django_site" does not exist

LINE 1: SELECT (1) AS "a" FROM "django_site" LIMIT 1

请帮忙解决这个问题。


然后,如果您切换回SQLite作为数据库后端并从空数据库开始,它会再次正常工作吗? - Louis
1
这可能与Django 1.8中的更改有关:如果表已经存在,请尝试在迁移时使用“--fake-initial”选项;它曾经是隐式的,但现在已经变成了显式的:https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---fake-initial。您是否尝试删除SQLite DB或PostgreSQL DB? - FlipperPA
是的,我已经尝试删除数据库了。当我运行 python manage.py migrate --fake-initial myapp 时,它会给出错误提示:该应用程序没有迁移(您无法选择性地同步未迁移的应用程序)。 - max
1
现在似乎可以工作了。我删除了所有的pyc文件。 - max
删除pyc文件对我来说还不够... :-/ - FSp
最近我遇到了类似的问题,尽管是在运行测试时,但这个解决方案并没有起作用。最终我发现我没有将'allauth.socialaccount'应用程序添加到我的已安装应用程序中。虽然我不知道为什么它突然开始出现这种情况。 - Simon
10个回答

16

我不喜欢注释/取消注释代码的想法,所以我尝试了一种不同的方法:我手动迁移了一些应用程序,然后对其余的应用程序运行django-admin.py migrate。在删除所有*.pyc文件之后,我的命令序列是:

$ django-admin.py migrate auth
$ django-admin.py migrate contentypes
$ django-admin.py migrate sites
$ django-admin.py migrate MY_CUSTOM_USER_APP
$ django-admin.py migrate

这里的MY_CUSTOM_USER_APP是包含我在settings文件中设置的AUTH_USER_MODEL模型的应用程序名称。

希望能有所帮助。顺便说一下,似乎在Django 1.8中同步数据库的最佳方法非常复杂,这让人感到奇怪。我想知道是否有什么我遗漏的东西(我对Django 1.8不是很熟悉,我曾经使用过旧版本)。


逐个关闭应用程序帮助我找到了问题所在。 - Denis

11

在使用 Django 1.10 的过程中,我发现另一种解决方案:

我的应用程序名为 "web",首先我调用:

python manage.py makemigrations web

然后我打电话:

python manage.py makemigrations auth

然后我调用:

python manage.py migrate

惊讶:它正在工作! :) 看起来 auth 正在搜索 AUTH_USER_MODEL "web.UserProfile" 和一个名为 web_user_profile 的关系,但是它没有找到,因此出现了错误。 另一方面,首先调用 makemigrations web 将先创建所需的关系,然后 auth 才能检查并发现它不存在。


8

6
我曾经也遇到同样的问题,花了几个小时苦思冥想,最终在评论中找到了解决方案。我的问题是CircleCI无法运行测试,因为出现了这个错误。我本以为需要使用一个新的空DB重新开始,但是我得到了相同的错误。所有问题似乎都与“auth”、“contenttypes”和“sites”有关。
我阅读了这个这个这个以及这个。但对我来说,这些都不是解决方案。
所以,在摧毁了我的数据库并创建了一个新的数据库之后,我发现完全避免这些django.db.utils.ProgrammingError的唯一解决方案是:
  1. 注释掉与User模型相关的所有代码。
  2. 删除项目中的所有.pyc文件!find . -name "*.pyc" -exec rm -- {} +感谢@max!
  3. 运行./manage.py migrate(没有fake、fake-initial、auth或contenttypes的迁移,只是纯粹的migrate)。
  4. 取消上述代码的注释,并再次运行迁移!
我的INSTALLED_APP如下:
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sites',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'mptt',
    'djangobower',
    'honeypot',
    'django_hosts',
    'leaflet',
    'multiselectfield',
    'corsheaders',
    'rest_framework_swagger',
    'allauth',
    'allauth.account',
    # 'allauth.socialaccount',
    # 'allauth.socialaccount.providers.twitter',
    # 'allauth.socialaccount.providers.facebook',
    'project.<app_name>',
)

1
第二次运行迁移时,你注释掉的代码不会运行,但是当你想在其他地方部署应用程序并从头开始运行迁移时会发生什么呢?如果与用户相关的代码不必要,那么你应该将其删除。 - borfast
使用另一个模型对我有效。 - Piotr Wasilewicz
我也试过了,对我也起作用。虽然我不必删除.pyc文件,但我必须注释掉forms.py、urls.py和views.py。 - Malachi Bazar

2
我有同样的问题,但是我的根本原因是迁移文件夹中的__init__.py文件已从源代码中删除,但在本地未删除(导致“不在我的计算机上”的错误)。
即使使用Python 3,迁移文件夹仍需要__init__.py文件。

2

使用以下命令删除迁移文件、相关的.pyc文件以及为了安全起见所有的.pyc文件并不能解决我的问题。

$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
$ find . -path "*/migrations/*.pyc"  -delete
$ find . -name "*.pyc" -exec rm -- {} +

解决我的问题的不是清除缓存,而是因为我有一个函数在默认函数参数中执行了一个查询。在初始化时,例如makemigrationsmigrate命令执行之前,django(也许是python属性?)似乎会初始化所有默认参数。
由于我的数据库完全为空(我需要执行migrate --run-syncdb重新创建表),所以当下面的默认参数被初始化时,它会对空数据库进行查询,随后失败。
将此更改为:
def generate_new_addresses(number=1, index=None, wallet=get_active_wallet()):
   ...
   ...
   return

to:

def generate_new_addresses(number=1, index=None, wallet=None):
   if not wallet:
      wallet = get_active_wallet()
   ...
   ...
   return

1
在我的情况下,当postgresql驱动程序能够连接到数据库但提供的用户无法访问模式或表等时,会出现此错误。错误显示的是查询的数据库表未被找到,而不是权限被拒绝。通常,在这种情况下,当迁移命令尝试创建django_migrations表时,也会失败并显示类似的错误。
请检查在Django中使用的数据库连接中所使用的用户是否已被授予访问权限。

0
在我的情况下, 我使用了一些其他类似的迁移文件(1)来进行迁移。 然后我删除了它,并创建了两个新的迁移文件作为替代(2和3)。 然后我遇到了这个错误。
在我的情况下,表格是通过迁移文件1重命名的, 但Django在迁移文件3中搜索旧表格名称。
所以我手动将表格重命名为旧名称,并应用了迁移,成功了。

0

我在使用forms.ChoiceForm查询集时遇到了问题。我能够切换到使用forms.ModelChoiceForm,它们是惰性评估的,这为我解决了问题。


-1
错误的根本原因是数据库(postgres或sqlite)没有找到您正在插入或执行CRUD操作的关系。解决方案是进行迁移。 python manage.py makemigrations python manage.py migrate

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