将本地数据库推送到Heroku时如何添加PostGIS扩展?
解决Heroku pg:push结合PostGIS扩展的问题
不能直接在pg:push的默认流程中执行CREATE EXTENSION postgis;——pg:push要求远程数据库必须为空,而手动创建扩展后数据库会被标记为非空,触发Remote database is not empty的报错;但如果不提前创建扩展,pg:push导入数据时会因PostGIS类型(如public.geography)不存在而失败。
以下是两种可行的解决方法:
方法一:自定义备份+手动导入
- 本地导出数据库时排除PostGIS相关架构,避免重复创建扩展的冲突
pg_dump --exclude-schema=postgis --exclude-schema=topology -Fc -d 本地数据库名 > local_db.dump - 在Heroku的空数据库中先创建PostGIS扩展
heroku pg:psql -c "CREATE EXTENSION postgis;" - 将本地备份导入Heroku数据库
heroku pg:restore --app 你的Heroku应用名 local_db.dump
方法二:用脚本串联重置、建扩展、推送流程
编写一个shell脚本,自动完成“清空远程库→创建扩展→执行pg:push”的完整流程,避免手动操作的矛盾:
#!/bin/bash # 替换成你的本地数据库名和Heroku应用名 LOCAL_DB="你的本地数据库名" HEROKU_APP="你的Heroku应用名" # 重置远程数据库(需要确认操作) heroku pg:reset DATABASE --confirm $HEROKU_APP # 创建PostGIS扩展 heroku pg:psql -c "CREATE EXTENSION postgis;" # 执行pg:push推送本地数据 heroku pg:push $LOCAL_DB DATABASE --app $HEROKU_APP
执行脚本前确保本地PostgreSQL服务正常,且Heroku CLI已登录。
内容的提问来源于stack exchange,提问作者Duncan Felix
相关产品推荐
相关产品推荐

