Heroku部署Django应用出现DatabaseOperations无geo_db_type属性错误
Django部署Heroku触发
geo_db_type属性缺失报错解决方案 报错原因
你遇到的AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'错误,核心原因是生产环境的Django数据库引擎未使用PostGIS版本,和你项目中用到的GIS地理空间功能不兼容。
你的配置中仅在本地开发环境指定了django.contrib.gis.db.backends.postgis作为数据库引擎,部署到Heroku时通过dj_database_url.config()读取环境变量生成的数据库配置,默认使用普通PostgreSQL引擎,不支持GIS相关方法。同时django_heroku.settings(locals())默认会覆盖数据库配置,进一步导致你手动修改的引擎参数失效。
解决方案
按以下步骤修改配置即可修复:
- 修改生产环境数据库配置,手动指定PostGIS引擎。找到生产环境数据库配置段,修改为如下内容:
elif len(sys.argv) > 0: if os.getenv("DATABASE_URL", None) is None: raise Exception("DATABASE_URL environment variable not defined") DATABASES = { "default": dj_database_url.config(), } # 追加此行,强制使用PostGIS引擎 DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
- 修改
django_heroku调用参数,禁止其覆盖数据库配置,避免引擎被重置为普通PostgreSQL版本:
# 新增databases=False参数 django_heroku.settings(locals(), databases=False)
- 配置Heroku端依赖环境:
- 确认Heroku PostgreSQL数据库已开启PostGIS扩展,可通过Heroku提供的psql终端执行SQL命令
CREATE EXTENSION postgis;完成开启 - 在Heroku应用的构建包配置中,添加官方地理空间构建包,放置在Python构建包之前,解决GDAL、GEOS依赖缺失问题
- 确认Heroku PostgreSQL数据库已开启PostGIS扩展,可通过Heroku提供的psql终端执行SQL命令
- 配置修改完成后重新推送代码到Heroku,执行迁移命令
python manage.py migrate即可正常运行。
内容的提问来源于stack exchange,提问作者E.Mohammed
相关产品推荐
相关产品推荐

