4

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

这怎么可能解决?

长篇大论:

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

    ALTER DATABASE tst SET search_path = "$user", public
    
  4. 当连接到数据库而不在 URL 中指定当前模式时,默认模式是公共的,因此它会找到所有地理函数和对象。但是我app1在寻址对象时必须指定模式前缀app1,例如:

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

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

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

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

4

2 回答 2

11

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

  • currentSchema = String

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

所以试试:

jdbc:postgresql://localhost:5432/tst?currentSchema=app1,public

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

或者,如果您的用户名恰好是app1,则搜索路径设置 会自动"$user", public解析为app1, public,您无需执行任何额外操作。

于 2016-09-13T00:37:45.900 回答
0

使用 python/psycopg2/SQLAlchemy,我不得不使用

postgresql://localhost:5432/tst?options=-c%20search_path=app1,public
于 2020-10-13T10:15:01.483 回答