URL中的currentSchema与search_path不能正常工作

spo*_*boy 2 postgresql jdbc search-path

当在数据库连接URL中指定参数时,我的SQL命令在从public架构(位于默认DB中search_path)中查找对象时遇到问题currentSchema

如何解决?

长话说:

  1. 我有一个应用程序架构app1
  2. 数据库在public架构中安装了Postgis扩展(我们希望将其保留在该位置)。
  3. 数据库search_path的配置如下:

    ALTER DATABASE tst SET search_path = "$user", public
    
    Run Code Online (Sandbox Code Playgroud)
  4. 当连接数据库而未在URL中指定当前架构时,默认架构是公共的,因此它将查找所有地理功能和对象。但是app1当从中寻址对象时app1,我必须指定架构前缀,例如:

    select st_asgeojson(geometry,15,4) from app1.shapes limit 5
    
    Run Code Online (Sandbox Code Playgroud)
  5. 这不方便。因此,我将“ app1”作为当前模式参数添加到了连接URL,如下所示:

    jdbc:postgresql://localhost:5432/tst?currentSchema=app1
    
    Run Code Online (Sandbox Code Playgroud)
  6. 现在,当我连接到数据库时,从app1模式访问对象时不必指定app1前缀。但是,涉及Postgis对象的请求不再起作用,并且失败:

    错误:函数st_asgeojson(public.geometry,integer)不存在

我的理解是,它应该在中搜索对象search_path并在public架构中找到它们,但是由于某种原因它不会发生。我也尝试过在用户级别指定搜索路径,但仍然无法正常工作。

Erw*_*ter 6

参数名称currentSchema有点误导。它需要整体search_path,而不仅仅是“当前模式”。文档:

  • currentSchema = String

指定要在搜索路径中设置的架构。该模式将用于解析通过此连接在语句中使用的不合格对象名称。

因此,请尝试:

jdbc:postgresql://localhost:5432/tst?currentSchema=app1,public
Run Code Online (Sandbox Code Playgroud)

或者,如果您与特定用户连接,则可以search_path在数据库中为该用户(或在此数据库中为该用户)设置。然后,您在连接字符串中不需要任何内容​​。

或者,如果您的用户名恰好是app1,则搜索路径设置 "$user", publicapp1, public自动解决,您无需执行任何其他操作

  • 谢谢这个作品。但是,我不得不删除引号(否则它不起作用)。所以,URL 应该是这样的:jdbc:postgresql://localhost:5432/tst?currentSchema=app1,public。也许您可以更正您的答案,因为我花了几分钟才弄清楚报价问题。 (2认同)