search_path 与 URL 中的 currentSchema 无法按预期工作

search_path doesn't work as expected with currentSchema in URL

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

如何解决这个问题?

长话短说:

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

    ALTER DATABASE tst SET search_path = "$user", public
    
  4. 当在 URL 中未指定当前架构连接到数据库时,默认架构是 public,因此它会找到所有地理函数和对象。但是在从 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 对象的请求不再有效并失败:

    ERROR: function st_asgeojson(public.geometry, integer) does not exist

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

参数名称currentSchema有点误导。它需要 整个 search_path,而不仅仅是 "current schema"。 The documentation:

  • currentSchema = String

Specify the schema to be set in the search-path. This schema will be used to resolve unqualified object names used in statements over this connection.

所以尝试:

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

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

或者,如果你的用户名刚好是app1,那么搜索路径设置 "$user", public 自动解析为 app1, public,您不需要额外做 任何事情

  • How does the search_path influence identifier resolution and the "current schema"

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

postgresql://localhost:5432/tst?options=-c%20search_path=app1,public