使用JDBC连接到postgres时是否可以指定架构?


Answers:


204

我知道已经回答了这个问题,但是我遇到了同样的问题,试图指定用于liquibase命令行的架构。

更新 从JDBC v 9.4开始,您可以使用新的currentSchema参数指定url,如下所示:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

根据较早的补丁出现:

http://web.archive.org/web/20141025044151/http://postgresql.1045698.n5.nabble.com/Patch-to-allow-setting-schema-search-path-in-the-connectionURL-td2174512。 html

哪个提议的URL是这样的:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema

2
是的,但是在撰写本文时(2012年末),它还不是9.1驱动程序的一部分,请参阅:连接参数
user272735 2012年

你试过了吗?因为它没有作为以前的驱动程序的一部分列出,但仍然可以使用。
Hiro2k 2012年

8
尝试了9.3-1101-jdbc41和9.1,对我不起作用
Ignacio A. Poletti 2014年

@ IgnacioA.Poletti setSchema创建连接后,尝试使用JDCB 方法。为我使用最新的postgres驱动程序。
beldaz

7
我们还通过使用其他(较新的)JDBC驱动程序解决了此问题。在我们的案例中postgresql-9.4.1209.jdbc42.jar,它与9.5数据库和?currentSchema=myschema语法一起使用。
SebastianH

63

9.4版开始,您可以currentSchema在连接字符串中使用参数。

例如:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

48

如果在您的环境中可行,还可以将用户的默认架构设置为所需的架构:

ALTER USER user_name SET search_path to 'schema'

1
如果需要,最好更改数据库本身,以便同一用户可以使用不同的search_paths连接到不同的数据库:ALTER DATABASE dbname SET search_path TO public,schemaname;
阿拉斯加

44

我不相信有一种方法可以在连接字符串中指定架构。看来您必须执行

set search_path to 'schema'

建立连接后指定架构。


2
这对我Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
有用

有一种方法可以在连接字符串(jdbc uri)中指定默认架构。请参阅下面的答案。
basilikode


7

DataSourcesetCurrentSchema

在实例化DataSource实现时,寻找一种设置当前/默认架构的方法。

例如,在PGSimpleDataSource类调用上setCurrentSchema

org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource ( );
dataSource.setServerName ( "localhost" );
dataSource.setDatabaseName ( "your_db_here_" );
dataSource.setPortNumber ( 5432 );
dataSource.setUser ( "postgres" );
dataSource.setPassword ( "your_password_here" );
dataSource.setCurrentSchema ( "your_schema_name_here_" );  // <----------

如果未指定架构,则Postgres默认为public数据库中命名的架构。请参见手册第5.9.2节“公共模式”。引用帽子手册:

在前面的部分中,我们创建了没有指定任何模式名称的表。默认情况下,此类表(和其他对象)会自动放入名为“ public”的架构中。每个新数据库都包含这样的架构。


3
尝试连接到模式 ”-有点误导。驱动程序不“连接到架构”,而是连接到数据库。查询使用哪种模式取决于search_path
a_horse_with_no_name



0

这已经被回答:

jdbc:postgresql:// localhost:5432 / mydatabase?currentSchema = myschema

与前面的答案一样,上述连接字符串也有效。

我已经检查了,没关系:https : //youtu.be/m0lBUHSLkNM?t=79

(尽管接受的答案是在8年前给出的,但它在1年前进行了编辑...)


1
这与8年前接受的答案有何不同?
stdunbar

好吧,在评论中也有一些帖子引起了人们怀疑它可能无法发挥的作用。。因此,我已经进行了测试,并且已经将我的测试发布为视频(我是新成员,还不能对其他人的回答发表评论)。-同样,尽管接受的答案是在8年前给出的,但它是在1年前编辑的。。。
AlexSandu75 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.