spo*_*boy 2 postgresql jdbc search-path
当在数据库连接URL中指定参数时,我的SQL命令在从public架构(位于默认DB中search_path)中查找对象时遇到问题currentSchema。
如何解决?
长话说:
app1。public架构中安装了Postgis扩展(我们希望将其保留在该位置)。数据库search_path的配置如下:
ALTER DATABASE tst SET search_path = "$user", public
Run Code Online (Sandbox Code Playgroud)当连接数据库而未在URL中指定当前架构时,默认架构是公共的,因此它将查找所有地理功能和对象。但是app1当从中寻址对象时app1,我必须指定架构前缀,例如:
select st_asgeojson(geometry,15,4) from app1.shapes limit 5
Run Code Online (Sandbox Code Playgroud)这不方便。因此,我将“ app1”作为当前模式参数添加到了连接URL,如下所示:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1
Run Code Online (Sandbox Code Playgroud)现在,当我连接到数据库时,从app1模式访问对象时不必指定app1前缀。但是,涉及Postgis对象的请求不再起作用,并且失败:
错误:函数st_asgeojson(public.geometry,integer)不存在
我的理解是,它应该在中搜索对象search_path并在public架构中找到它们,但是由于某种原因它不会发生。我也尝试过在用户级别指定搜索路径,但仍然无法正常工作。
参数名称currentSchema有点误导。它需要整体search_path,而不仅仅是“当前模式”。文档:
currentSchema = String指定要在搜索路径中设置的架构。该模式将用于解析通过此连接在语句中使用的不合格对象名称。
因此,请尝试:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1,public
Run Code Online (Sandbox Code Playgroud)
或者,如果您与特定用户连接,则可以search_path在数据库中为该用户(或在此数据库中为该用户)设置。然后,您在连接字符串中不需要任何内容。
或者,如果您的用户名恰好是app1,则搜索路径设置
"$user", public将app1, public自动解决,您无需执行任何其他操作。