【问题标题】:Postgis installation: type "geometry" does not existPostgis安装:类型“几何”不存在
【发布时间】:2011-10-14 14:19:18
【问题描述】:

我正在尝试使用 Postgis 创建表。我是通过这个page 来做的。但是当我导入 postgis.sql 文件时,我得到了很多错误:

ERROR:  type "geometry" does not exist

有人知道我该如何解决吗?

【问题讨论】:

    标签: postgresql geometry postgis


    【解决方案1】:

    我遇到了同样的问题,但是通过运行以下代码解决了这个问题

    CREATE EXTENSION postgis;
    

    详细一点,

    1. 打开pgAdmin
    2. 选择(单击)您的数据库
    3. 点击栏上的“SQL”图标
    4. 运行“创建扩展 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 文件

                  【讨论】:

                    猜你喜欢
                    • 2014-10-06
                    • 2019-11-04
                    • 2023-01-20
                    • 2020-10-28
                    • 2023-01-11
                    • 1970-01-01
                    • 2013-01-09
                    • 1970-01-01
                    • 2021-06-28
                    相关资源
                    最近更新 更多