我是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'
这是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()
也许它应该是这样的,因为南方是一个生产工具,因此它与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.
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
答案 0 :(得分:7)
当您在South
中注释掉INSTALLED_APPS
时,是否可以让您在本地运行python manage.py syncdb
?
我认为问题在于您使用default
中的dj_database_url
行覆盖了settings.py
数据库。当您使用Heroku时,会有一个名为DATABASE_URL
的环境变量,这是dj_database_url
用于配置数据库的内容。但是,如果您在本地没有类似的环境变量,则无法正确配置数据库。 South抛出错误的原因是它在初始化时尝试连接到您的数据库(请注意错误来自南方__init__
)。如果您在评论南方后尝试在本地实际使用您的数据库,我猜测您会收到错误。
有两种方法可以解决这个问题。第一个也是最简单的是在本地计算机上创建DATABASE_URL
变量。根据您在上面列出的设置,将DATABASE_URL
设置为'postgres://alejandro:zzzzz@localhost/dbolib'
。第二个也是比较困难的,就是在你的设置中添加一些内容来基本检查你是否在Heroku上,如果没有,则跳过dj_database_url
配置。基本上,将dj_database_url
行设置在if
语句中,如果在Heroku上则返回True
,如果没有,则返回False
。
编辑:
它有点混乱,但是如果你想把它全部保存在一个文件中,你可以做类似以下的事情:
首先,尝试使用dj_database_url
设置默认数据库。这意味着将以下代码移到设置中的DATABASES
设置上方
import dj_database_url
DATABASES = {}
DATABASES['default'] = dj_database_url.config()
此代码将您的默认数据库设置为等于dj_database_url的结果。但是,可能没有结果。您将要测试此(这将指示本地开发)并相应地设置数据库。因此,在上一个代码之后,添加以下代码:
if len(DATABASES['default']) == 0:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbolib',
'USER': 'alejandro',
'PASSWORD': 'zzzzz'
}
}
这会检查您的数据库中是否有任何内容[&#39;默认&#39;]如果没有,则使用您的本地设置设置默认数据库。
这有点乱,但它会起作用。更好的选择可能是使用不同的设置文件,这增加了另一层复杂性。确实,最好的选择是在所有计算机上设置DATABASE_URL
环境变量,以便dj_database_url
能够正常工作。