如何将Heroku Postgres中PostGIS扩展从heroku_ext移至public schema?
解决Heroku PostgreSQL PostGIS扩展从heroku_ext迁移至public的问题
步骤1:修正Data Labs命令的参数错误
你之前执行heroku data:labs:enable时的报错,是因为addon参数需要填数据库的附加组件名称,而非DATABASE_URL。先通过以下命令获取正确的附加组件名称:
heroku addons -a {OUR_APP_NAME}
找到类似heroku-postgresql:{PLAN_NAME}的条目(比如heroku-postgresql:hobby-dev),这就是你的数据库附加组件标识。之后重新执行启用命令:
heroku data:labs:enable extensions-on-any-schema --addon {HEROKU_POSTGRESQL_ADDON_NAME} -a {OUR_APP_NAME}
步骤2:以超级用户身份迁移扩展
启用Data Labs功能后,需要通过Heroku提供的临时超级用户权限执行迁移。先进入数据库的超级用户shell:
heroku pg:psql {HEROKU_POSTGRESQL_ADDON_NAME} -a {OUR_APP_NAME} --superuser
进入shell后执行迁移命令:
ALTER EXTENSION postgis SET SCHEMA public;
该命令会将PostGIS的所有关联对象(包括spatial_ref_sys表)完整迁移至public schema。
步骤3:验证迁移结果
迁移完成后,在psql shell中执行以下SQL确认状态:
SELECT n.nspname AS schema_name, c.relname AS table_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relname = 'spatial_ref_sys';
如果返回的schema_name字段值为public,则说明迁移成功。
步骤4:调整Django配置(可选)
若迁移后Django仍无法识别空间表,可在项目settings.py的数据库配置中添加schema搜索路径:
DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME': '你的数据库名称', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '数据库主机地址', 'PORT': '5432', 'OPTIONS': { 'options': '-c search_path=public,heroku_ext' } } }
通常迁移完成后无需此步骤,仅作为兜底方案。
内容的提问来源于stack exchange,提问作者Jarema Piekutowski
相关产品推荐
相关产品推荐

