create extension postgis; 报错主因是postgis与postgresql主版本不匹配或共享库缺失:需用pg_config --version确认真实版本(如15.9),安装对应包(如postgresql-15-postgis-3),检查pg_config --sharedir下存在postgis.control、--pkglibdir下存在postgis.so,并确保plpgsql已启用、用户有权限、目标库非template1。

CREATE EXTENSION postgis; 会报错,基本不是你 SQL 写错了,而是 PostGIS 根本没装对——它和 PostgreSQL 主版本(如 15.x)必须严格配对,差一个小版本都可能失败。
确认 PostgreSQL 主版本和 pg_config 路径
别只信 postgres --version,它显示的是二进制版本,不反映实际构建来源。真正决定 PostGIS 兼容性的是 pg_config 输出的版本和路径:
- 运行
pg_config --version,例如输出15.9→ 你需要postgresql-15-postgis-3,不是postgis或postgis-3 - 运行
pg_config --sharedir,记下路径(如/usr/share/postgresql/15),后面要查extension/postgis.control是否落在里面 - 运行
pg_config --pkglibdir,检查该目录下是否存在postgis.so;没有就说明共享库根本没装进去
用系统包管理器安装对应版本的 PostGIS
在 Ubuntu/Debian 上,apt install postgis 是无效的——它不带 PostgreSQL 版本号,控制文件不会落到正确位置。
- 先查清你的 PG 主版本(见上一步),再装带版本号的包:
sudo apt install postgresql-15-postgis-3 - 验证控制文件是否存在:
ls /usr/share/postgresql/15/extension/postgis.control,缺这个文件,CREATE EXTENSION必然报could not open extension control file - CentOS/RHEL 用户用 YUM:确保已启用 PGDG 仓库,然后装
postgresql15-postgis3(注意命名规则差异,不是postgis3_15)
在数据库中启用扩展前的三件关键检查
即使包装对了,CREATE EXTENSION postgis; 还是失败,大概率卡在这三点:
- 连接用户必须是数据库 owner 或 superuser;普通用户执行会提示
permission denied to create extension - 目标数据库不能是
template1;如果想让新库自动带 PostGIS,得先临时取消它的模板属性:UPDATE pg_database SET datistemplate = false WHERE datname = 'template1';,执行完扩展后再设回true -
plpgsql扩展必须已启用:CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;—— PostGIS 依赖它,否则会静默失败或函数缺失
验证是否真能用,别只看 CREATE EXTENSION 成功
很多人看到 CREATE EXTENSION 返回 CREATE EXTENSION 就以为搞定了,结果一跑空间函数就报 function st_astext does not exist。
- 先查扩展状态:
SELECT extname, extversion, extnamespace::regnamespace FROM pg_extension WHERE extname = 'postgis';,确认extnamespace是public(或你期望的 schema) - 检查搜索路径:
SHOW search_path;,如果没包含public,函数就找不到;可临时加:SET search_path TO public, "$user", pg_catalog; - 最终验证语句:
SELECT ST_AsText(ST_Point(1, 1));,返回POINT(1 1)才算通路;若仍失败,尝试加 schema 前缀:SELECT public.ST_AsText(ST_Point(1, 1));
postgis.control 文件的位置——它必须在 $PGSHARE/extension/ 下,而 $PGSHARE 由 pg_config --sharedir 决定。很多离线安装或混装多个 PG 版本的环境,文件放错目录,错误又不报具体路径,只能靠手动 ls 确认。











