在执行syncdb时,获取"DatabaseOperations"对象没有属性"geo_db_type"错误

Gad*_*ady 56 django heroku geodjango

我正在尝试heroku run python manage.py syncdb在Heroku上运行我的GeoDjango应用程序,但是我收到以下错误:

AttributeError:'DatabaseOperations'对象没有属性'geo_db_type'

所有 我的 研究已经取得了相同的解决方案:确保使用django.contrib.gis.db.backends.postgis的数据库引擎.有趣的是,我已经这样做了(我也有django.contrib.gisINSTALLED_APPS):

settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.contrib.gis.db.backends.postgis',
    'NAME': '...',
    'HOST': '...',
    'PORT': ...,
    'USER': '...',
    'PASSWORD': '...'
  }
}

INSTALLED_APPS = (
    ...,
    'django.contrib.gis',
)
Run Code Online (Sandbox Code Playgroud)

还有其他我想念的东西吗?非常感谢任何帮助,下面是完整的错误跟踪供参考:

Running `python manage.py syncdb` attached to terminal... up, run.1
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/app/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 91, in handle_noargs
    sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
  File "/app/lib/python2.7/site-packages/django/db/backends/creation.py", line 44, in sql_create_model
    col_type = f.db_type(connection=self.connection)
  File "/app/lib/python2.7/site-packages/django/contrib/gis/db/models/fields.py", line 200, in db_type
    return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
Run Code Online (Sandbox Code Playgroud)

更新:我按照GeoDjango教程Heroku/Django教程,构建了一个适用于我的开发机器的简单应用程序.我使用自定义GeoDjango buildpack将它推送到Heroku ,并尝试了syncdb,但得到了同样的错误.这是Django/GeoDjango,Heroku或buildpack的问题吗?我的开发环境使用PostgreSQL 9.1和PostGIS 2.0,但是Heroku使用9.0.9和1.5,这可能是问题吗?

wks*_*rtz 71

OP正在使用GeoDjango buildpack,但是如果有人使用Geo buildpack来到这里并且dj_database_url像我一样,settings.py请不要忘记最后一行:

import dj_database_url
DATABASES['default'] = dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
Run Code Online (Sandbox Code Playgroud)

UPDATE

dj_database_url 直接支持 PostGIS.如果您可以更改数据库URL,则可以不使用上面代码中的最后一行postgis.


boz*_*doz 24

尝试使用测试数据库集运行测试时出现此错误:

if 'test' in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': '_testdb',
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是sqlite3 DatabaseOperations对象没有属性geo_db_type(就像这篇文章的标题所暗示的那样).

我的解决方案是将后端更改为sqlite等效的GIS引擎:

        'ENGINE': 'django.contrib.gis.db.backends.spatialite'
Run Code Online (Sandbox Code Playgroud)

有关所有可能的后端,请参阅geodjango安装的django文档,并附带安装说明:https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database


sup*_*amp 11

我遇到了同样的问题,因此我不得不更改:

'ENGINE': 'django.db.backends.postgresql_psycopg2',
Run Code Online (Sandbox Code Playgroud)

至:

'ENGINE': 'django.contrib.gis.db.backends.postgis',
Run Code Online (Sandbox Code Playgroud)


Mit*_* W. 8

这篇文章很老了,但我只是想分享一下这个问题的答案.我正在使用Dj数据库包,我不知道使用PostGIS时连接URL是不同的.PostGIS的连接字符串是postgis://USER:PASSWORD@HOST:PORT/NAME

希望这有助于某人.


Rya*_*der 6

对我有帮助

1)'django.contrib.gis',加到INSTALLED_APPS
2)从

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
Run Code Online (Sandbox Code Playgroud)

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.mysql', 
Run Code Online (Sandbox Code Playgroud)


小智 5

我正在使用堆栈cedar 14上的 Python 示例应用程序和带有 PostGIS的常规 Heroku buildpack Heroku/python,并且遇到了同样的问题,即我的数据库设置被错误的数据库引擎覆盖,导致heroku run python manage.py migrate失败并出现上述错误。只是在设置中添加引擎不会改变任何东西。经过一番调查,我发现这是django_heroku.settings(locals())我的 settings.py 最后一行中的调用,它正在恢复我的更改。

我通过在之后添加一行再次覆盖引擎来修复它:

django_heroku.settings(locals())
DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
Run Code Online (Sandbox Code Playgroud)


Aka*_*ari 5

我将默认数据库引擎从 更改psycopg2postgis

之前

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        ...,
    }
}
Run Code Online (Sandbox Code Playgroud)

现在

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        ...,
    }
}
Run Code Online (Sandbox Code Playgroud)


Gad*_*ady -2

构建包是这里的罪魁祸首。我没有使用Heroku 构建包页面上列出的 GeoDjango 构建包,而是使用了最近更新的其中一个分支。

另外,当我执行 a 时git push heroku master,Heroku 会为应用程序创建一个开发数据库,​​而当我执行syncdb 时,我的DATABASES设置将被忽略,Heroku 会尝试使用开发数据库......显然是一个问题,因为开发数据库不/无法安装 PostGIS。git push因此,我在使用(使用正确的 buildpack )创建开发数据库后销毁了开发数据库,​​然后运行syncdb并且它可以工作。

  • 虽然问题是 Heroku 特有的,但标题却相当笼统。如果 Django DATABASES ENGINE 未设置为 django.contrib.gis.db.backends.postgis,也会出现此问题 (6认同)