Django Migrations表示数据库后端不可用

时间:2015-09-14 21:46:58

标签: django postgresql postgis django-migrations

我试图将Django 1.6.2应用程序升级到1.7.10。我使用运行PostgreSQL 9.3.4和PostGIS 2.1.1的Postgres.app版本9.3.4在我的Mac上运行PostgreSQL。我遇到的问题是,当我运行新的" 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应用程序中使用了相同的DATABASE ENGINE设置,没有任何问题。在研究这个问题时,其他一些开发人员忘记在他们的虚拟环境中安装psycopg2,但我的安装版本是2.6.1。我使用2.5.2版与Django 1.6.2,但如果我将psycopg2回滚到该版本,我仍然会收到此错误。我已经阅读了这两个版本之间的所有psycopg2发行说明,但没有看到任何可能导致此问题的内容。
Django 1.7 GeoDjango tutorial也使用了这个postgis引擎设置,因此它似乎不被弃用,并且Django 1.7发行说明中没有任何相关内容表明这可能是一个问题。

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

最后,我进行了网络搜索,但没有看到任何讨论此迁移/​​数据库引擎问题的文章。有谁看到了什么错?

谢谢!

# 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

5 个答案:

答案 0 :(得分:3)

我遇到类似的问题,从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依赖关系 - &gt;而消失了。在OSX上为我brew install --upgrade gdal

答案 1 :(得分:2)

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

答案 2 :(得分:0)

正确的解决方法是安装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

答案 3 :(得分:0)

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没有工作 - &gt;所以如果上述解决方案不起作用,你也应该这样做。)

答案 4 :(得分:0)

settings.py中的

DATABASES不喜欢大写字母(或者postresql不喜欢)。

我通过在数据库“ NAME”字段中将大写字母更改为小写来解决此问题。

application.css

蜜饯:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'MyDatabase',     <*****WRONG******
        'USER': 'admin',
        'PASSWORD': 'pass123',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}