search_path 与 URL 中的 currentSchema 无法按预期工作
search_path doesn't work as expected with currentSchema in URL
在数据库连接中指定 currentSchema
参数时,我的 SQL 命令在从 public
模式(在默认数据库 search_path
中)查找对象时遇到问题URL。
如何解决这个问题?
长话短说:
- 我有一个应用程序架构
app1
。
- 数据库在
public
架构中安装了 Postgis 扩展(我们希望将其保留在那里)。
数据库search_path
配置如下:
ALTER DATABASE tst SET search_path = "$user", public
当在 URL 中未指定当前架构连接到数据库时,默认架构是 public,因此它会找到所有地理函数和对象。但是在从 app1
寻址对象时,我必须指定 app1
模式前缀,例如:
select st_asgeojson(geometry,15,4) from app1.shapes limit 5
这不方便。所以我将 "app1" 作为当前架构参数添加到连接 URL 中,如下所示:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1
现在,当我连接到数据库时,在从 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
在数据库连接中指定 currentSchema
参数时,我的 SQL 命令在从 public
模式(在默认数据库 search_path
中)查找对象时遇到问题URL。
如何解决这个问题?
长话短说:
- 我有一个应用程序架构
app1
。 - 数据库在
public
架构中安装了 Postgis 扩展(我们希望将其保留在那里)。 数据库
search_path
配置如下:ALTER DATABASE tst SET search_path = "$user", public
当在 URL 中未指定当前架构连接到数据库时,默认架构是 public,因此它会找到所有地理函数和对象。但是在从
app1
寻址对象时,我必须指定app1
模式前缀,例如:select st_asgeojson(geometry,15,4) from app1.shapes limit 5
这不方便。所以我将 "app1" 作为当前架构参数添加到连接 URL 中,如下所示:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1
现在,当我连接到数据库时,在从 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