É possível especificar o esquema ao conectar-se ao postgres com o JDBC?

Respostas:

204

Eu sei que isso já foi respondido, mas acabei de encontrar o mesmo problema, tentando especificar o esquema a ser usado para a linha de comando liquibase.

Atualizar No JDBC v 9.4, você pode especificar o URL com o novo parâmetro currentSchema da seguinte forma:

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

Aparece com base em um patch anterior:

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

Qual URL proposto é o seguinte:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
Hiro2k
fonte
2
Sim, mas no momento da redação (final de 2012) não faz parte do driver 9.1 , consulte: Parâmetros de conexão .
user272735
Você tentou? Porque não foi listado como parte do driver anterior, mas ainda funcionou.
Hiro2k 27/09/12
8
Tentei com 9,3-1101-jdbc41 e 9.1, não funciona para mim
Ignacio A. Poletti
@ IgnacioA.Poletti Tente usar o setSchemamétodo JDCB depois de criar sua conexão. Funciona para mim com um driver recente do postgres.
beldaz
7
Resolvemos esse problema usando também um driver JDBC (mais recente) diferente. No nosso caso, postgresql-9.4.1209.jdbc42.jartrabalhamos em conjunto com um 9.5banco de dados e a ?currentSchema=myschemasintaxe.
Sebastian
63

A partir da versão 9.4 , você pode usar o currentSchemaparâmetro na sua cadeia de conexão.

Por exemplo:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
Distortum
fonte
48

Se for possível no seu ambiente, você também pode definir o esquema padrão do usuário para o esquema desejado:

ALTER USER user_name SET search_path to 'schema'
chzbrgla
fonte
1
Provavelmente é melhor ALTERAR o próprio banco de dados para que o mesmo usuário possa se conectar a diferentes bancos de dados com diferentes caminhos de pesquisa, se necessário: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska
44

Não acredito que haja uma maneira de especificar o esquema na cadeia de conexão. Parece que você precisa executar

set search_path to 'schema'

após a conexão ser feita para especificar o esquema.

Herks
fonte
2
Isso funcionou para mim, especificamente usando a instância "Connection" para executar: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara
Existe uma maneira de especificar o esquema padrão na cadeia de conexão (jdbc uri). Veja as respostas abaixo.
precisa
7

DataSource - setCurrentSchema

Ao instanciar uma DataSourceimplementação, procure um método para definir o esquema atual / padrão.

Por exemplo, na PGSimpleDataSourcechamada de classe 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_" );  // <----------

Se você deixar o esquema não especificado, o Postgres assumirá como padrão o esquema nomeado publicno banco de dados. Consulte o manual, seção 5.9.2 O esquema público . Para citar o manual do chapéu:

Nas seções anteriores, criamos tabelas sem especificar nenhum nome de esquema. Por padrão, essas tabelas (e outros objetos) são automaticamente colocadas em um esquema chamado "public". Todo novo banco de dados contém esse esquema.

Basil Bourque
fonte
3
" tenta se conectar a um esquema " - isso é um pouco enganador. O driver não se conecta "a um esquema", mas a um banco de dados . O esquema usado pelas consultas depende da configuração atual dosearch_path
a_horse_with_no_name
3

Não esqueça SET SCHEMA 'myschema'que você poderia usar em uma declaração separada

SET SCHEMA 'value' é um alias para o valor SET search_path TO. Somente um esquema pode ser especificado usando esta sintaxe.

E desde as versões 9.4 e possivelmente anteriores no driver JDBC, há suporte para o setSchema(String schemaName)método.

Beldaz
fonte
3

Em Vá com "sql.DB" (observe o search_pathsublinhado):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Rafael Barros
fonte
0

Isso já foi respondido:

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

Como nas respostas anteriores, a cadeia de conexão acima simplesmente funciona.

Eu verifiquei e está tudo bem: https://youtu.be/m0lBUHSLkNM?t=79

(Embora a resposta aceita tenha sido dada há 8 anos, foi editada há 1 ano...)

AlexSandu75
fonte
1
Como isso difere da resposta aceita de 8 anos atrás?
stdunbar
Bem, nos comentários também havia posts que estavam lançando algumas dúvidas de que talvez não funcionasse,. . Então testei e publiquei o teste como um vídeo (sou um novo membro e ainda não posso comentar as respostas de outros). - também, embora a resposta aceita tenha sido dada há 8 anos, foi editada há 1 ano. . .
AlexSandu75