Postgis安装:类型“几何”不存在
Posted
技术标签:
【中文标题】Postgis安装:类型“几何”不存在【英文标题】:Postgis installation: type "geometry" does not exist 【发布时间】:2011-10-14 14:19:18 【问题描述】:我正在尝试使用 Postgis 创建表。我是通过这个page 来做的。但是当我导入 postgis.sql 文件时,我得到了很多错误:
ERROR: type "geometry" does not exist
有人知道我该如何解决吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,但是通过运行以下代码解决了这个问题
CREATE EXTENSION postgis;
详细一点,
-
打开pgAdmin
选择(单击)您的数据库
点击栏上的“SQL”图标
运行“创建扩展 postgis;”代码
【讨论】:
谢谢。顺便说一句,如果有人使用“psql”运行此代码,请确保该角色具有“超级用户”属性/权限。 救生员!我以为我已经设置好了,所以我一直认为这是别的东西...... 请注意,这是特定于您正在使用的特定数据库的。它不是安装范围的。 我把 pg_dump 放回去了,也遇到了同样的问题。我的 postgis 扩展将它的数据放入一个自定义的 SCHEME 中,称为postgis
。我需要运行以下命令,一切又恢复正常:DO $$ BEGIN EXECUTE 'alter database '||current_database()||' set search_path = "$user", public, lookup, postgis'; END; $$ ;
【参考方案2】:
如果加载了 Postgis-Extension,那么您的 SQL 可能由于缺少公共架构的搜索路径而找不到几何类型。
试试
SET search_path = ..., public;
在脚本的第一行。 (将 ... 替换为其他必需的搜索路径)
【讨论】:
【参考方案3】:您可以从终端执行此操作:
psql mydatabasename -c "CREATE EXTENSION postgis";
【讨论】:
【参考方案4】:要让 psql 在第一个错误时停止,请使用-v ON_ERROR_STOP=1
(即off by default,这就是您看到许多错误的原因)。例如:
psql -U postgres -d postgis -v ON_ERROR_STOP=1 -f postgis.sql
实际错误类似于“无法加载库 X”,这可能因您的情况而异。作为猜测,请在安装 sql 脚本之前尝试此命令:
ldconfig
(您可能需要前缀sudo
,具体取决于您的系统)。此命令更新所有系统库的路径,例如 GEOS。
【讨论】:
【参考方案5】:如果您尝试在另一个架构而不是 public
上使用 postgis 类型,也可能会出现此错误。
如果您使用 postgis 2.3 或更高版本创建自己的架构并遇到此错误,请执行以下操作as stated here:
CREATE SCHEMA IF NOT EXISTS my_schema;
CREATE extension postgis;
UPDATE pg_extension
SET extrelocatable = TRUE
WHERE extname = 'postgis';
ALTER EXTENSION postgis
SET SCHEMA my_schema;
ALTER EXTENSION postgis
UPDATE TO "2.5.2next";
ALTER EXTENSION postgis
UPDATE TO "2.5.2";
SET search_path TO my_schema;
然后您可以继续使用 postgis 功能。
【讨论】:
【参考方案6】:您必须在您的数据库上启用扩展。
psql my_database -c "CREATE EXTENSION postgis;"
【讨论】:
【参考方案7】:您还需要确保您尝试使用 postgis 扩展的用户有权访问设置 postgis 的架构(在我阅读的教程中称为“postgis”)。
我刚刚遇到了这个错误,由于我只授予了新用户对数据库的访问权限,因此问题已得到解决。在我创建的数据库中,我运行:
grant all on schema postgis to USERNAME;
这解决了这个错误
【讨论】:
只需要USAGE
。除非你是认真的,否则不要授予ALL
。【参考方案8】:
此处的答案可能会解决您的问题,但是如果您已经在数据库上启用了 postgis,则问题可能是您正在尝试将 postgis 表(带有几何列)恢复到您的 postgis 扩展之外的架构中已启用。在 pgAdmin 中,您可以单击 postgis 扩展并查看指定的架构。如果您尝试将具有几何列的表恢复到不同的架构,您可能会收到此错误。
我通过更改我的 postgis 扩展解决了这个问题 - 但是我不确定这是否一定是最好的方法。我所知道的是它允许我恢复表。
【讨论】:
在 Postgis 版本 2.3 之前,您可以将扩展移动到另一个模式,这几次为我解决了这个问题【参考方案9】:首先确保您已安装(与 pg 版本匹配:psql -V)postgis:
sudo apt install postgis postgresql-9.6-postgis-2.3
就在创建表之前添加:
db.engine.execute('create extension postgis')
db.create_all()
【讨论】:
这对我有用。我只需将声明稍微更改为CREATE EXTENSION IF NOT EXISTS postgis
,这样它就不会在后续启动时失败。【参考方案10】:
或者……
cursor.execute('create extension postgis')
在您的 python 程序中,使用 psycopg2 中的当前光标。
【讨论】:
【参考方案11】:这已经被回答了,但我想添加一个更全面的答案,解释为什么某些命令有效,在什么情况下使用它们,当然,如何弄清楚你在什么情况下在里面。
首先,您需要检查您的盒子上是否实际安装了 PostGIS。当连接到 postgres 时,例如通过 psql,运行:
SELECT PostGIS_Full_Version();
如果尚未安装,请查找特定于发行版和版本的安装 PostGIS 的说明并进行安装。
假设 PostGIS 已安装,错误通常是由于没有“创建”特定数据库的扩展(不幸的是,这是一种误导性的语言使用,其效果更像是“启用”扩展)特定数据库的扩展。 PostgreSQL 的设置方式,默认情况下,新数据库没有启用任何扩展,您需要为每个数据库启用(“创建”)它们。为此,您需要运行以下命令。
只需要运行一次:
CREATE EXTENSION postgis;
我认为您需要特定数据库的超级用户权限才能运行此命令。
假设 postgres 配置为允许权限,您可以通过运行以下命令从命令行执行此命令:
psql my_database -c "CREATE EXTENSION postgis;"
您可能需要使用-U
标志并指定用户。
但是,在某些情况下,扩展程序可能已经创建并安装在与公共不同的架构下,问题可能是权限之一。这可能会像@mozboz 描述的情况一样出现,如果您创建一个新用户但不授予它访问架构的权限。要检测这种情况,请在数据库中查找一个单独的架构,其中包含一个名为 spatial_ref_sys
的表,因为它是在创建扩展时创建的。
在这种情况下,您可能需要在连接到数据库时运行:
GRANT USAGE ON SCHEMA schema_name TO username;
根据我的经验,这种情况很少见,而且我从来没有找到任何理由以这种方式进行设置。 schema_name
通常是 postgis
,但并非总是如此。默认情况下,如果您在此处运行第一个命令,它将在 public
架构下创建扩展。
我认为 USAGE 通常足以满足大多数情况,但如果您希望用户能够实际编辑数据,则可能需要授予更多权限;对我来说,唯一一次出现这种情况是向spatial_ref_system
添加新的投影,但即使这样也很少见,因为默认情况下该表包含最常用的投影。
【讨论】:
【参考方案12】:我的经验是我试图将 ism 文件加载到与“public”不同的文件中。我在公共以外的另一个模式上初始化了 postgis 扩展。所以那没有用。所以最后我不得不删除扩展,然后公开创建 postgis 扩展。之后我可以将 osm 加载到我的新架构中
Osm 总是在公共场合寻找扩展文件,不管你打算在哪里安装另一个模式中的 osm 文件
【讨论】:
以上是关于Postgis安装:类型“几何”不存在的主要内容,如果未能解决你的问题,请参考以下文章
Postgis 和 Postgresql:类型错误“st_point”不存在
错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在