Django的.南.Heroku的.KeyError:'默认'

Ale*_*lla 4 database django heroku django-south

我是Heroku的新手,所以我尝试按字面意思按照说明操作,因为这个错误我迷失了.因此,当我包含在"Heroku上使用Django入门"中编写的settings.py配置时,除非我从已安装的应用程序中注释掉南方,否则我无法再运行本地服务器.

这是错误:

 from south.db import DEFAULT_DB_ALIAS
 File "/home/alejandro/Proyectos/olenv/local/lib/python2.7/site-packages/south/db/__init__.py", line 83, in <module>
 db = dbs[DEFAULT_DB_ALIAS]
 KeyError: 'default'
Run Code Online (Sandbox Code Playgroud)

这是settings.py中的相关设置:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'dbolib',
    'USER': 'alejandro',
    'PASSWORD': 'zzzzz'
}
}

 # --- HEROKU --- #
 # Parse database configuration from $DATABASE_URL
 import dj_database_url
 DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)

也许它应该是这样的,因为南方是一个生产工具,因此它与Heroku冲突.也许不是,因为我是Heroku的新手,任何澄清都会有所帮助.

编辑 当我向南注释并尝试运行syncdb时,我发现此错误:

File "/home/alejandro/Proyectos/olenv/local/lib/python2.7/site-packages/django/db/backends/dummy/base.py", line 15, in complain
raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Run Code Online (Sandbox Code Playgroud)

requirements.txt:

Django==1.6
South==0.8.4
argparse==1.2.1
dj-database-url==0.3.0
dj-static==0.0.5
django-crispy-forms==1.4.0
django-debug-toolbar==1.2
django-endless-pagination==2.0
django-extensions==1.3.5
django-toolbelt==0.0.1
gunicorn==18.0
psycopg2==2.5.2
pystache==0.5.4
six==1.6.1
sqlparse==0.1.11
static==1.0.2
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 7

当你在你的评论SouthINSTALLED_APPS,是否让你在python manage.py syncdb本地运行?

我认为问题是你default用你的dj_database_url线路覆盖你的数据库settings.py.当您使用Heroku时,会有一个名为的环境变量DATABASE_URL,dj_database_url用于配置数据库.但是,如果本地没有类似的环境变量,则无法正确配置数据库.South抛出错误的原因是因为它在初始化时尝试连接到您的数据库(请注意错误来自South的错误__init__).如果你在评论南方后试图在本地实际使用你的数据库,我猜你会收到一个错误.

有两种方法可以解决这个问题.第一个也是最简单的方法是DATABASE_URL在本地计算机上创建一个变量.根据您上面列出的设置,将您设置DATABASE_URL'postgres://alejandro:zzzzz@localhost/dbolib'.第二个,也是更困难的是在你的设置中添加一些内容来基本上检查你是否在Heroku上,如果没有,则跳过dj_database_url配置.基本上,dj_database_url在你的设置中将你的行嵌套在一个if语句中,True如果在Heroku上则会返回,False如果没有.

编辑:

它有点乱,但如果你想把它全部保存在一个文件中,你可以做类似以下的事情:

首先,尝试使用设置默认数据库dj_database_url.这意味着将以下代码移到DATABASES您设置中的设置上方:

import dj_database_url
DATABASES = {}
DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)

此代码将您的默认数据库设置为等于dj_database_url的结果.但是,可能没有结果.您将要测试此(这将指示本地开发)并相应地设置数据库.因此,在上一个代码之后,添加以下代码:

if len(DATABASES['default']) == 0:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'dbolib',
            'USER': 'alejandro',
            'PASSWORD': 'zzzzz'
    }
}
Run Code Online (Sandbox Code Playgroud)

这将检查您的DATABASES ['default']中是否有任何内容,如果没有,则使用本地设置设置默认数据库.

这有点乱,但它会起作用.更好的选择可能是使用不同的设置文件,这增加了另一层复杂性.确实,最好的选择是DATABASE_URL在所有机器上设置环境变量,以便它能够dj_database_url正常工作.