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

时间:2012-09-21 21:37:59

标签: django heroku geodjango

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

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

All of my research已经产生了相同的解决方案:确保使用django.contrib.gis.db.backends.postgis作为数据库引擎。有趣的是我已经在做这个(我在django.contrib.gis中也有INSTALLED_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 tutorialHeroku/Django tutorial,并构建了一个适用于我的开发机器的简单应用。我使用custom GeoDjango buildpack将其推送到Heroku,并尝试了syncdb,但得到了同样的错误。这是Django / GeoDjango,Heroku或buildpack的问题吗?我的开发环境是使用PostgreSQL 9.1和PostGIS 2.0,但是Heroku使用9.0.9和1.5,这可能是问题吗?

11 个答案:

答案 0 :(得分:61)

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

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

更新

dj_database_url directly supports PostGIS。如果您可以将数据库URL更改为以postgis开头,则可以不使用上面代码中的最后一行。

答案 1 :(得分:21)

尝试使用如此设置的测试数据集运行测试时出现此错误:

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

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

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

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

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

答案 2 :(得分:6)

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

希望这有助于某人。

答案 3 :(得分:4)

对我有帮助

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

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

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

答案 4 :(得分:4)

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

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

收件人:

'ENGINE': 'django.contrib.gis.db.backends.postgis',

答案 5 :(得分:2)

我将默认数据库引擎从psycopg2更改为postgis

以前

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

现在

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        ...,
    }
}

答案 6 :(得分:1)

在python3中我得到了同样的错误:

  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 673, in db_parameters
    type_string = self.db_type(connection)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py", line 105, in db_type
    return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'

我已正确使用dj-database-url设置引擎,但我仍然看到错误

我添加了一个print语句来输出我的数据库设置,因为它们被py

解释

settings.py

if os.getenv('DYNO'):
    GDAL_LIBRARY_PATH = os.path.expandvars(os.getenv('GDAL_LIBRARY_PATH'))
    GEOS_LIBRARY_PATH = os.path.expandvars(os.getenv('GEOS_LIBRARY_PATH'))
    DATABASES['default'] =  dj_database_url.parse(os.getenv('DATABASE_URL'),'django.contrib.gis.db.backends.postgis')
    print(DATABASES['default'])

这是print语句输出heroku服务器解释为DATABASES['default']凭据的内容。看起来发动机正确设置。

{'NAME': 'name', 'USER': 'usr', 'PASSWORD': 'pw', 'HOST': 'herokuec2host.amazonaws.com', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.contrib.gis.db.backends.postgis'}

答案 7 :(得分:0)

我在堆栈 cedar 14 上使用Python示例应用程序,并在PostGIS上使用常规Heroko buildpack heroku / python ,但遇到的问题是我的数据库设置被覆盖错误的数据库引擎,导致heroku run python manage.py migrate因上述错误而失败。 仅在设置中添加引擎不会更改任何内容。 经过一番调查,我发现如果我的settings.py恢复了所做的更改,则是对最后一行django_heroku.settings(locals())的调用。

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

django_heroku.settings(locals())
DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'

答案 8 :(得分:0)

<块引用>

Settings.py > INSTALLED_APPS

INSTALLED_APPS = [
.
.
'django.contrib.gis'
.
]
<块引用>

Settings.py > 数据库

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

答案 9 :(得分:-1)

我忘了在settings.py中进一步注释掉db设置:

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

这些行覆盖了我在上面添加的设置

答案 10 :(得分:-2)

buildpack是这里的罪魁祸首。我没有使用Heroku's buildpack page上列出的GeoDjango buildpack,而是使用了最近更新过的one of it's forks

此外,当我执行git push heroku master时,Heroku会为应用创建一个开发数据库,​​当我执行syncdb时,我的DATABASES设置被忽略并且Heroku会尝试使用dev数据库 相反......显然是一个问题,因为开发数据库没有/不能安装PostGIS。所以我使用git push(使用correct buildpack)创建了dev数据库,然后运行了syncdb,它就可以了。