Django 迁移说数据库后端不可用

Django Migrations Says Database Backend Isn't Available

我正在尝试将 Django 1.6.2 应用程序升级到 1.7.10。我在我的 Mac 上 运行ning PostgreSQL 使用 Postgres.app 版本 9.3.4,运行s PostgreSQL 9.3.4 和 PostGIS 2.1.1。我遇到的问题是,当我 运行 新的 "makemigrations" 命令时,出现以下错误(整个堆栈跟踪在底部):

django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.postgis' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    u'base', u'mysql', u'oracle', u'postgresql_psycopg2', u'sqlite3'
Error was: cannot import name BaseSpatialOperations

以下是相关设置:

# conf/settings/base.py
DATABASES = {
    'default': {
        'ENGINE'  : 'django.contrib.gis.db.backends.postgis',
        'NAME'    : 'geodb',
        'USER'    : 'geo',
        'PASSWORD': 'geopassword',   # not really
        'HOST'    : 'localhost',
        'PORT'    : '',
    }
}
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.gis',
    'apps.admin',  # my apps live in an apps subdir.
    'apps.home',
)
POSTGIS_VERSION = (2,1,1)

我在我的 Django 1.6.2 应用程序中使用了相同的数据库引擎设置,没有任何问题。在对此进行研究时,其他一些开发人员忘记在他们的虚拟环境中安装 psycopg2,但我确实在我的环境中安装了 2.6.1 版。我在 Django 1.6.2 中使用 2.5.2 版,但如果我将 psycopg2 回滚到该版本,我仍然会收到此错误。我已经阅读了这两个版本之间的所有 psycopg2 发行说明,但没有看到任何可能导致此问题的内容。
Django 1.7 GeoDjango tutorial 也使用此 postgis 引擎设置,因此它似乎没有被弃用,并且 Django 1.7 发行说明中没有任何相关内容表明这可能是一个问题。

我还构建了上面提到的 GeoDjango 教程的测试版本,如果我 运行 在上面使用 makemigrations 命令,我会得到同样的错误。

最后,我进行了网络搜索,没有看到任何讨论此 migrations/database 引擎问题的文章。有没有人看出哪里出了问题?

谢谢!

# Full stacktrace
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/contrib/auth/models.py", line 40, in <module>
    class Permission(models.Model):
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/models/base.py", line 122, in __new__
    new_class.add_to_class('_meta', Options(meta, **kwargs))
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/models/base.py", line 297, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/models/options.py", line 166, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/__init__.py", line 40, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/utils.py", line 242, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/me/venv/dj_17/lib/python2.7/site-packages/django/db/utils.py", line 126, in load_backend
    raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.postgis' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    u'base', u'mysql', u'oracle', u'postgresql_psycopg2', u'sqlite3'
Error was: cannot import name BaseSpatialOperations

出于想法,我将 Django 从 1.7.10 升级到 1.8.4,问题就消失了。我不知道为什么会修复它,但确实如此。

我在从 1.9.9 升级到 1.10.1 时遇到了类似的问题

django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.postgis' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    'mysql', 'oracle', 'postgresql', 'sqlite3'
Error was: cannot import name 'GDALRaster'

它通过升级 gdal 依赖项消失了 -> brew install --upgrade gdal 我在 OSX

正确的解决方法是安装 gdal-bin 包 (sudo apt-get install gdal-bin)。对于 Xenial (16.04),它已经在标准包中可用。对于早期版本,您可能需要在执行 apt-get install:

之前执行这两个附加步骤
sudo add-apt-repository ppa:ubuntugis/ppa
sudo apt-get update
django.core.exceptions.ImproperlyConfigured: 
   'django.db.backends.postgresql_psycopg' is not an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
  'mysql', 'oracle', 'postgresql', 'sqlite3'

好吧,我完全按照要求做了,将引擎更改为:

"ENGINE":"django.db.backends.postgresql"

现在可以使用了。

(在此之前我尝试了 sudo apt-get install gdal-bin 但没有用 -> 所以如果上述解决方案不起作用,你也应该这样做。)