Django 1.4.2 / South 0.7.6数据库错误 - DEFAULT_DB_ALIAS

时间:2013-01-27 09:47:24

标签: django django-south

当我运行python manage.py runserver时,我收到以下错误:

Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x1cc9cd0>>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/validation.py", line 30, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 158, in get_app_errors
    self._populate()
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 64, in _populate
    self.load_app(app_name, True)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 88, in load_app
    models = import_module('.models', app_name)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/usr/local/lib/python2.7/dist-packages/South-0.7.6-py2.7.egg/south/models.py", line 2, in <module>
    from south.db import DEFAULT_DB_ALIAS
  File "/usr/local/lib/python2.7/dist-packages/South-0.7.6-py2.7.egg/south/db/__init__.py", line 81, in <module>
    db = dbs[DEFAULT_DB_ALIAS]
KeyError: 'default'

这是我的 settings.py

 DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'foureggs',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': '',
        'PORT': '',
    }
}

这是question同样的问题。答案说“你的设置中应该有一个名为'default'的数据库”。我并不是真的那样。我的数据库名称是“foureggs”,所以我显然想要使用它。

更新:当我python manage.py diffsettings时,我得到以下输出,看起来不正确(仅粘贴相关的DATABASE行,其余部分设置看起来没问题):

DATABASES = {'default': {'ENGINE': 'django.db.backends.dummy', 'TEST_MIRROR': None, 'NAME': '', 'TEST_CHARSET': None, 'TIME_ZONE': 'UTC', 'TEST_COLLATION': None, 'PORT': '', 'HOST': '', 'USER': '', 'TEST_NAME': None, 'PASSWORD': '', 'OPTIONS': {}}}

我的项目中只有一个设置文件,它位于app目录中,这是正确的。上面的DATABASE行来自哪里?

更新2:我弄清楚问题是什么。根据{{​​3}}的指示,这是我向settings.py添加的另外两行。当我评论它们时,一切正常。现在我需要弄清楚它导致问题的原因。

# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

5 个答案:

答案 0 :(得分:2)

我通过设置这样的Heroku配置解决了这个问题:

# Parse database configuration from $DATABASE_URL
import dj_database_url

dbconfig = dj_database_url.config()
if dbconfig:
    DATABASES['default'] =  dbconfig

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

答案 1 :(得分:1)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'foureggs',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': '',
        'PORT': '',
    }
}

您需要填写HOSTPORT,否则django不知道您的数据库服务器在哪里。只有你使用的是sqlite,才有空。

对于postgreql,默认端口为5432。如果您在同一台计算机上运行服务器,请使用'localhost'作为'HOST'密钥,否则将其放入数据库服务器的IP地址。

答案 2 :(得分:1)

在我的情况下,我正在开发环境(MY LAPTOP),当我收到错误时,这些是我的开发环境

import dj_database_url
DATABASES['default'] =  dj_database_url.config()

if not os.environ.has_key('DATABASE_URL'):
     os.environ['DATABASE_URL'] = 'postgres://my_db:my_db@localhost/my_db'

后来我把它改成了,事情开始正常了

if not os.environ.has_key('DATABASE_URL'):
         os.environ['DATABASE_URL'] = 'postgres://my_db:my_db@localhost/my_db'

import dj_database_url
    DATABASES['default'] =  dj_database_url.config()

dj_database_url.config()函数调用需要初始化DATABASE_URL

答案 3 :(得分:0)

问题显然与南方无关,而与数据库后端无关。

  1. 您可以从这里开始:"settings.DATABASES is improperly configured" error performing syncdb with django 1.4和相关问题

  2. 如果上述答案不起作用,首先检查是否安装了psycopg2库并在sys.path中:如果没有,请安装Psycopg2 library install instructions here

  3. 然后您最终可以将ENGINE设置更改为:'postgresql_psycopg2';通过这种方式,如果由于任何原因它无法工作,您可以绕过内置引擎。

答案 4 :(得分:0)

按照Heroku说明后我遇到了这个问题。你是对的,这些行是罪魁祸首:

# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

这会将DATABASES值切换回dj_database_url包使用的默认值,该包具有引擎&#34; django.db.backends.dummy&#34;等等。如果你将这些换成这些行,它应该工作:

# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] = dj_database_url.config(default='postgres://localhost/foureggs')

但是,你不想将它部署到Heroku,因为它不会在那里工作。我发现的修复程序假定您正在使用虚拟环境。如果是这样,导航到虚拟环境的文件夹并进入bin目录(cd $ VIRTUAL_ENV / bin),添加一个名为&#34; postactivate&#34;并将此行保存在其中:

export DATABASE_URL='postgres://localhost/foureggs'

现在每次激活虚拟环境时,它都会以该值开始。