django 1.8无法django.db.utils.ProgrammingError:关系“auth_user”不存在

时间:2015-06-17 16:36:56

标签: django django-models

我有一个django 1.7的工作项目,现在我把它移到django 1.8。 我可以syncdb使用sqlite运行应用程序,但是当我切换到postgres时,它无法执行 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

请帮助解决此问题。

9 个答案:

答案 0 :(得分:11)

我不喜欢评论/取消评论代码的想法,所以我尝试了一种不同的方法:我手动迁移了#34;某些应用,然后为剩余的应用运行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是包含我在AUTH_USER_MODEL文件中设置settings的模型的应用程序的名称。

希望它可以提供帮助。顺便说一下,在Django 1.8中同步你的数据库的最佳方法是如此复杂,这似乎很奇怪。我想知道我是否遗漏了一些东西(我不熟悉Django 1.8,我曾经使用旧版本)

答案 1 :(得分:6)

始终使用python manage.py makemigrations迁移数据库,然后在较新版本中迁移python manage.py migrate。对于上述错误,如果您第一次迁移数据库,请使用python manage.py migrate --fake-initial。请参阅文档https://docs.djangoproject.com/en/1.9/ref/django-admin/#django-admin-migrate

答案 2 :(得分:5)

使用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能够检查并提醒它不存在。

答案 3 :(得分:4)

我遇到了同样的问题,我花了好几个小时试图找到一个解决方案,这个解决方案隐藏在评论中。我的问题是,由于这个错误,CircleCI无法运行测试。而且我认为我需要从一个新的空DB开始。但我得到了同样的错误。一切似乎与“认证”,“内容类型”和“内容类型”相关。和&#39;网站&#39;。

我阅读了thisthis,以及thisthis。对我来说没有解决方案。

因此,在销毁了我的数据库并创建了一个新数据库之后,我发现完全避免这些django.db.utils.ProgrammingError的唯一解决方案是:

  1. 注释掉与User模型相关的所有代码。
  2. 删除项目中的所有.pyc文件! find . -name "*.pyc" -exec rm -- {} +谢谢@max!
  3. 运行./manage.py migrate(没有虚假,没有虚假初始,没有移植过&#39; auth&#39;或者#39;之前,juste plain migrate。
  4. 取消注释上面的代码,然后再次运行迁移!
  5. 我的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>',
    )
    

答案 4 :(得分:0)

在我的情况下,当postgresql驱动程序能够连接到数据库,但提供的用户无权访问架构或表等时,出现此错误。表示找不到正在查询的数据库表。通常,在这种情况下,当它试图创建django_migrations表时,migrate命令也会因类似的错误而失败。

检查在Django的数据库连接中正在使用的用户是否被授予访问权限。

答案 5 :(得分:0)

使用以下命令删除迁移文件,关联的.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

收件人:

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

答案 6 :(得分:0)

我遇到了同样的问题,但是我的根本原因是其中一个迁移文件夹中的__init__.py文件已从源代码中删除,但未从本地删除(导致“不在我的机器上”错误)。

即使使用Python 3,迁移文件夹仍需要__init__.py文件。

答案 7 :(得分:0)

我在使用forms.ChoiceForm查询集时遇到了这个问题。我可以切换到使用forms.ModelChoiceForm,这是懒惰的评估,这为我解决了这个问题。

答案 8 :(得分:-1)

错误的根本原因是db(postgres或sqlite)未找到要为其插入或执行CRUD的关系。 解决方案是进行迁移

python manage.py makemigrations <app_name> python manage.py migrate