Django/Postgres 迁移失败 "django.db.utils.ProgrammingError: relation "django_site" does not exist"

9

我在迁移一个Django 1.8.1项目时遇到了问题

Operations to perform:
  Synchronize unmigrated apps: raven_contrib_django, staticfiles, found_dash, messages, allauth, humanize
  Apply all migrations: account, found_auth, sessions, admin, sites, auth, found_assets, contenttypes
Synchronizing apps without migrations:
  Creating tables...
    Creating table allauth_socialapp
    Creating table allauth_socialaccount
    Creating table allauth_socialtoken
    Running deferred SQL...
Raven is not configured (logging is disabled). Please see the documentation for more information.
Traceback (most recent call last):
  File "src/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/found/env/local/lib/python2.7/site-packages/raven/contrib/django/management/__init__.py", line 41, in new_execute
    return original_func(self, *args, **kwargs)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/found/env/local/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 "/found/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 317, in sync_apps
    cursor.execute(statement)
  File "/found/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/found/env/local/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/found/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: relation "django_site" does not exist

它抱怨django_site不存在。这是我的应用程序配置:
INSTALLED_APPS = (
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',...

包含了sites框架。这个错误只会在使用Postgres数据库时发生,SQLite数据库可以正常工作。

数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'found',
        'USER': 'found',
        'PASSWORD': 'xxx',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

完整配置在这里

./manage.py dbshell可以成功进入数据库:

(env)deploy@w1:/found$ src/manage.py dbshell
Password for user found: 
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

found=> \dt
             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | django_migrations | table | found
(1 row)

found=> 

运行 ./manage.py flush 命令。
(env)deploy@w1:/found$ src/manage.py flush
You have requested a flush of the database.
This will IRREVERSIBLY DESTROY all data currently in the 'found' database,
and return each table to an empty state.
Are you sure you want to do this?

    Type 'yes' to continue, or 'no' to cancel: yes
Traceback (most recent call last):
  File "src/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/commands/flush.py", line 84, in handle
    self.emit_post_migrate(verbosity, interactive, database)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/commands/flush.py", line 105, in emit_post_migrate
    emit_post_migrate_signal(set(all_models), verbosity, interactive, database)
  File "/found/env/local/lib/python2.7/site-packages/django/core/management/sql.py", line 280, in emit_post_migrate_signal
    using=db)
  File "/found/env/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 201, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/found/env/local/lib/python2.7/site-packages/django/contrib/sites/management.py", line 20, in create_default_site
    if not Site.objects.using(using).exists():
  File "/found/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 586, in exists
    return self.query.has_results(using=self.db)
  File "/found/env/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 479, in has_results
    return compiler.has_results()
  File "/found/env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in has_results
    return bool(self.execute_sql(SINGLE))
  File "/found/env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 837, in execute_sql
    cursor.execute(sql, params)
  File "/found/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/found/env/local/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/found/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "django_site" does not exist
LINE 1: SELECT (1) AS "a" FROM "django_site" LIMIT 1

你尝试过执行 ./manage flush 命令吗? - taesu
1
是的,我认为问题出在迁移顺序上混乱了。你可以查看allauth.account的源代码,它要求先迁移sites,但是在你的manage.py migrate中,我没有看到这种情况发生。所以我猜测可能有某个地方出现了错误。 - Yeo
1
是的,我得出了这个结论,但真的很奇怪,因为它在sqlite数据库上从来没有这个问题,只有在postgres上。 - wjdp
我有同样的问题,解决方案有什么提示吗?在sqlite上一切正常,但在postgres上失败了。 - iMitwe
我也发现一个应用程序在迁移中被跳过,原因不明。 - gregn
显示剩余9条评论
1个回答

4

问题出在Django内部。在创建表时,它没有考虑到您的应用程序对django_site的依赖。

然而,您可以通过为导致错误的具有django.contrib.sites依赖关系的应用程序创建迁移来轻松解决该问题。

解决方法:

src/manage.py makemigrations allauth

(现有的迁移将在稍后创建表,并在迁移的应用程序之间执行依赖关系检查。)

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