search_path在URL中的currentSchema中没有按预期工作

时间:2016-09-13 00:10:23

标签: postgresql jdbc search-path

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

怎么能修好?

长篇故事:

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

    ALTER DATABASE tst SET search_path = "$user", public
    
  4. 在未指定URL中的当前架构的情况下连接到DB时,默认架构是公共的,因此它会查找所有地理功能和对象。但是在处理来自app1的对象时,我必须指定app1模式前缀,例如:

    select st_asgeojson(geometry,15,4) from app1.shapes limit 5
    
  5. 这不方便。所以我添加了#34; app1"作为连接URL的当前架构参数,如下所示:

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

      

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

  7. 我的理解是它应该在search_path中搜索对象并在public架构中找到它们,但由于某种原因它不会发生。 我已经尝试在用户级别指定搜索路径,但它仍然无法正常工作。

2 个答案:

答案 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