错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在

Posted

技术标签:

【中文标题】错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在【英文标题】:ERROR: function postgis_lib_version() does not exist when matching a postgis custom schema 【发布时间】:2020-07-28 18:03:14 【问题描述】:

我有一个带有在 docker 容器中运行的 PostGIS 数据库的 rails 应用程序。我使用apartment 进行多租户,使用activerecord-postgis-adapter 从ActiveRecord 访问PostGIS 地理空间数据库功能。正如公寓文档所建议的那样,我在shared_extentions 模式中安装了 PostGIS。当我尝试在 geoserver 中配置数据存储时,出现以下错误:

Error creating data store, check the parameters. Error message: Unable to obtain connection: ERROR: function postgis_lib_version() does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts. Position: 8

Geoserver 数据存储连接参数:

host: app-db
port: 5432
database: app_development
schema: shared_extensions
user: 
passwd:

database.yml

default: &default
  adapter: postgis
  postgis_schema: shared_extensions
  schema_search_path: public, shared_extensions
  encoding: unicode
  database: app_development
  host: app-db
  username:
  password:

lib/tasks/db_enhancements.rake

namespace :db do
  desc 'Also create shared_extensions Schema'
  task :extensions => :environment  do
    # Create Schema
    ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
    # Enable Hstore
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
    # Enable Postgis
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS postgis SCHEMA shared_extensions;'
    # Enable UUID-OSSP
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
    # Grant usage to public
    ActiveRecord::Base.connection.execute 'GRANT usage ON SCHEMA shared_extensions to public;'
  end
end

我也在 pgAdmin 上使用SELECT shared_extensions.postgis_version() 进行了尝试,效果很好:

2.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1

当然,当我运行 SELECT postgis_version() 时,我得到:

ERROR:  function postgis_version() does not exist
LÍNEA 1: SELECT postgis_version()
                ^
SUGERENCIA:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 8

【问题讨论】:

【参考方案1】:

GeoServer 期望 PostGIS 安装在公共架构中,不会将 shared_extensions 添加到它的 postgis 函数中。如果您想这样做,则需要将shared_extensions 添加到搜索路径中,以便 GeoServer 可以找到它需要的功能。

ALTER DATABASE mydb SET 'search_path' = public,shared_extension;

有关如何将 postgis 移动到不同架构的详细信息,请参阅note。

【讨论】:

当我在database.yml中指定schema_search_path: public, shared_extensions时不应该设置这个吗?我的意思是,我不想从数据库中配置它,而是从我的 Rails 配置文件中配置它 如果已设置,您将不会看到此错误消息 正如我在描述中指定的那样,schema_search_path: public, shared_extensions 设置在database.yml 中,尽管在我创建数据库时没有应用它,显然这是错误,知道如何修复它? 不知道,但这不是地理服务器问题

以上是关于错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在的主要内容,如果未能解决你的问题,请参考以下文章

postgis将multi和geometrycollection转换成为多行数据,自定义函数

postgis将multi和geometrycollection转换成为多行数据,自定义函数

postgis将multi和geometrycollection转换成为多行数据,自定义函数

postgis将multi和geometrycollection转换成为多行数据,自定义函数

JavaScript高级 对象创建模式 object 对象字面量 工厂模式 自定义构造函数 构造函数+原型

使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配