使用JDBC连接到PostgreSQL时,是否可以指定模式?

229

有可能吗?我可以在连接URL中指定它吗?怎样做?

9个回答

314
我知道这个问题已经得到了回答,但是我刚遇到了同样的问题,尝试在liquibase命令行中指定要使用的模式。 更新 自JDBC v9.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

类似以下提议的网址:

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

2
是的,但在撰写本文时(2012年末),它不是9.1驱动程序的一部分,请参见:连接参数 - user272735
8
尝试使用9.3-1101-jdbc41和9.1,但对我来说无效。 - Ignacio A. Poletti
@IgnacioA.Poletti 在创建连接后尝试使用JDBC的setSchema方法。最近的Postgres驱动程序对我有效。 - beldaz
搜索路径无法工作...使用9.4。请参见:https://jdbc.postgresql.org/documentation/94/connect.html#connection-parameters - pablo.vix
7
我们解决了这个问题,也使用了一个不同(更新)的JDBC驱动程序。在我们的情况下,postgresql-9.4.1209.jdbc42.jar9.5数据库和?currentSchema=myschema语法一起工作。 - SebastianH
显示剩余4条评论

88

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

例如:

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

54

如果您的环境允许,您还可以将用户的默认模式设置为所需的模式:

ALTER USER user_name SET search_path to 'schema'

3
最好修改数据库本身,以便同一用户可以连接到不同的数据库,并具有不同的搜索路径(如果需要):ALTER DATABASE dbname SET search_path TO public,schemaname; - Flowchartsman

46

我认为没有一种方法可以在连接字符串中指定模式。看起来你必须执行

set search_path to 'schema'

在连接建立之后指定模式。


2
这对我有用,特别是使用“Connection”实例来运行:`Statement statement = connection.createStatement();try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }` - romeara
有一种方法可以在连接字符串(jdbc uri)中指定默认模式。请参见下面的答案。 - acorello

9

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节The Public Schema。引用该手册的话:
“在之前的章节中,我们创建了没有指定模式名称的表。默认情况下,这样的表(以及其他对象)会自动放入一个名为‘public’的模式中。每个新数据库都包含这样一个模式。”

4
attempts to connect to a schema” - 这有点误导人。驱动程序并不是连接“到一个模式(schema)”,而是连接到一个数据库。查询使用的模式取决于search_path的当前设置。 - user330315

8

使用“sql.DB”在Go中(请注意下划线的search_path):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema

7

4
不要忘记SET SCHEMA 'myschema',这可以在一个独立的语句中使用。

SET SCHEMA 'value'是SET search_path TO value的别名。只能使用这个语法指定一个模式。

自从9.4和可能更早版本的JDBC驱动程序开始,就支持setSchema(String schemaName)方法。

4

我已经尝试了在键值部分中使用currentSchema、searchpath和search_path,但都无法解决我的问题。

我找到了一个临时解决方法,使用"options"关键字:

postgresql://host:port/dbname?options=-c%20search_path%3Dschema_name


asyncpg不支持此功能。 - Vinícius OA
谢谢,这个可以用psql命令行工作 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接