77

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

AttributeError:“DatabaseOperations”对象没有属性“geo_db_type”

所有 研究都产生了相同的解决方案:确保用作数据库引擎。有趣的是我已经在这样做了(我也有): django.contrib.gis.db.backends.postgisdjango.contrib.gisINSTALLED_APPS

settings.py

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

INSTALLED_APPS = (
    ...,
    'django.contrib.gis',
)

还有什么我想念的吗?非常感谢任何帮助,以下是完整的错误跟踪供参考:

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'

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

4

10 回答 10

93

OP 使用的是 GeoDjango buildpack,但如果有人像我一样使用Geo buildpack到这里,请不要忘记最后一行:dj_database_urlsettings.py

import dj_database_url
DATABASES['default'] = dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'

更新

dj_database_url 直接支持PostGIS。如果您可以将数据库 URL 更改为以postgis.

于 2014-01-23T19:28:50.957 回答
36

尝试使用测试数据库集运行测试时出现此错误,如下所示:

if 'test' in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': '_testdb',
        }
    }

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

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

        'ENGINE': 'django.contrib.gis.db.backends.spatialite'

有关所有可能的后端,请参阅有关 GeoDjango 安装的 Django 文档,以及安装说明:https ://docs.djangoproject.com/en/3.0/ref/contrib/gis/install/#spatial-database

于 2016-06-15T03:44:43.560 回答
24

我遇到了同样的问题,我不得不改变:

'ENGINE': 'django.db.backends.postgresql_psycopg2',

到:

'ENGINE': 'django.contrib.gis.db.backends.postgis',
于 2019-02-27T14:54:51.797 回答
17

对我有帮助

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

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.mysql', 
于 2018-09-09T16:10:54.733 回答
12

这篇文章很旧,但我只是想分享我对这个问题的答案。我用的是dj数据库包,不知道用postgis的时候连接url不一样。PostGIS 的连接字符串是postgis://USER:PASSWORD@HOST:PORT/NAME

希望这可以帮助某人。

于 2016-03-29T05:07:46.307 回答
5

我在 stack 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'
于 2018-10-17T14:46:20.437 回答
5

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

之前

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        ...,
    }
}

现在

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        ...,
    }
}
于 2020-09-09T03:51:33.873 回答
0

设置.py > INSTALLED_APPS

INSTALLED_APPS = [
.
.
'django.contrib.gis'
.
]

Settings.py > 数据库

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.mysql',
     ...,
    }
} 
于 2021-03-26T09:46:30.980 回答
-1

在可能的情况下,我遇到了这个问题,因为我忘记在 settings.py 中进一步注释掉数据库设置:

# Update database configuration with $DATABASE_URL.
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

这些行覆盖了我在上面添加的设置。添加这个以防其他人有同样的问题。

于 2017-03-02T04:29:53.660 回答
-2

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

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

于 2012-09-28T16:25:35.420 回答