在数据库连接URL中指定public
参数时,我的SQL命令在查找search_path
架构(位于默认数据库currentSchema
)中的对象时遇到问题。
怎么能修好?
长篇故事:
app1
。public
架构中安装了Postgis扩展程序(我们希望将其保留在那里)。数据库search_path
的配置如下:
ALTER DATABASE tst SET search_path = "$user", public
在未指定URL中的当前架构的情况下连接到DB时,默认架构是公共的,因此它会查找所有地理功能和对象。但是在处理来自app1
的对象时,我必须指定app1
模式前缀,例如:
select st_asgeojson(geometry,15,4) from app1.shapes limit 5
这不方便。所以我添加了#34; app1"作为连接URL的当前架构参数,如下所示:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1
现在,当我连接到数据库时,我不必在从app1架构寻址对象时指定app1前缀。但是,涉及Postgis对象的请求不再起作用,并且失败了:
错误:函数st_asgeojson(public.geometry,integer)不存在
我的理解是它应该在search_path
中搜索对象并在public
架构中找到它们,但由于某种原因它不会发生。
我已经尝试在用户级别指定搜索路径,但它仍然无法正常工作。
答案 0 :(得分:4)
参数名称currentSchema
有点误导。它需要整个search_path
,而不仅仅是“当前架构”。 The documentation:
currentSchema = String
指定要在搜索路径中设置的架构。这个架构将是 用于解析语句中使用的非限定对象名称 连接。
所以试试:
jdbc:postgresql://localhost:5432/tst?currentSchema=app1,public
或者,如果您与特定用户建立连接,则可以在DB(或此数据库中的此用户)中为用户设置search_path
。然后你不需要连接字符串中的任何内容。
或者,如果您的用户名恰好是 app1
,那么搜索路径设置
"$user", public
会自动解析为app1, public
,您无需另外任何。
答案 1 :(得分:0)
我必须使用python / psycopg2 / SQLAlchemy
postgresql://localhost:5432/tst?options=-c%20search_path=app1,public