南方 + Django 1.4 数据库错误

25

我刚刚在新系统上安装了Django项目,并安装了Django 1.4。但是当我尝试运行manage.py runservermanage.py syncdb时,我从South收到以下错误:

Validating models...

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

我目前正在使用SQLite。 我认为这可能是由于Django 1.4的更改,但其他用户似乎没有遇到我的问题。 我的所有软件包都是最新的。

3个回答

41

我遇到了与已接受答案不同的错误信息,但是原因和解决方法不同。简短的回答是在settings.py中添加SOUTH_DATABASE_ADAPTERS = {'default':'south.db.postgresql_psycopg2'}

下面是完整的解释:

跟踪到 south/db/__init__.py 发现没有检测到任何数据库,原因是我的数据库引擎名称不在 south/db/__init__.py 的硬编码列表中。

engine_modules = {
    'django.db.backends.postgresql_psycopg2': 'postgresql_psycopg2',
    'django.db.backends.sqlite3': 'sqlite3',
    'django.db.backends.mysql': 'mysql',
    'django.db.backends.oracle': 'oracle',
    'sql_server.pyodbc': 'sql_server.pyodbc', #django-pyodbc
    'sqlserver_ado': 'sql_server.pyodbc', #django-mssql
    'firebird': 'firebird', #django-firebird
    'django.contrib.gis.db.backends.postgis': 'postgresql_psycopg2',
    'django.contrib.gis.db.backends.spatialite': 'sqlite3',
    'django.contrib.gis.db.backends.mysql': 'mysql',
    'django.contrib.gis.db.backends.oracle': 'oracle',
    'doj.backends.zxjdbc.postgresql': 'postgresql_psycopg2', #django-jython
    'doj.backends.zxjdbc.mysql': 'mysql', #django-jython
    'doj.backends.zxjdbc.oracle': 'oracle', #django-jython
}

我在Windows上使用postgis 2.0,不久前不得不对django的postgis后端应用一个小补丁。因为我没有从源代码安装django,所以我复制了后端并手动应用了这个补丁。因此,新的后端位于不同的位置,并且该位置不在上面显示的South的engine_modules键列表中。

幸运的是,South提供了一个名为SOUTH_DATABASE_ADAPTERS的设置变量,它直接告诉South每个别名的实际数据库引擎。我能够在settings.py中插入此行之后运行syncdb

SOUTH_DATABASE_ADAPTERS = {'default':'south.db.postgresql_psycopg2'}


8
在我的情况下,对我有用的是在DATABASES中设置了'ENGINE': 'mysql.connector.django',并且针对South使用了SOUTH_DATABASE_ADAPTERS = {'default': 'south.db.mysql'}。数据库是MySQL 5.6。 - Geradlus_RU
谢谢你的所有资金,@Kevin。现在我很富有!! - lastoneisbearfood

20
您的settings中没有正确的DATABASES设置。必须有一个名为'default'的数据库。

谢谢,我忘记了我正在检查我的主机名以使用本地设置,而我的主机名已经随着我的新系统更改,因此我的数据库未设置。 - saul.shanabrook
1
我也遇到了同样的错误。你能详细说明一下解决方案吗?谢谢@saul.shanabrook - Nazim Zeeshan
2
请按照提供的链接,查看文档中的最小工作示例。 - ilvar
能帮我一个忙吗?我在使用Jython,所以无法使用默认的PostgreSQL数据库连接器。 - pitchblack408

4

如果你使用的是Heroku,就像我一样。我也遇到了这个问题,我已经按照Heroku指南中提到的设置了默认数据库:

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

然而,“default” KeyError错误仍然出现。这是因为没有提供数据库,因此dj_database_url无法找到它并引发了这个令人困惑的错误。
要解决这个问题,只需按照Heroku PostgreSQL中所述的方式提供数据库并将其推广即可。
heroku addons:add heroku-postgresql:dev
heroku pg:promote HEROKU_POSTGRESQL_BLUE

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