É 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

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

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'

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.


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.


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.


3

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

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

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...)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.