¿Es posible especificar el esquema cuando se conecta a postgres con JDBC?

Respuestas:

204

Sé que esto ya fue respondido, pero me encontré con el mismo problema al tratar de especificar el esquema a utilizar para la línea de comando liquibase.

Actualización A partir de JDBC v 9.4 , puede especificar la url con el nuevo parámetro currentSchema de la siguiente manera:

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

Aparece según un parche 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

La url propuesta es así:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
Hiro2k
fuente
2
Sí, pero en el momento de la redacción (finales de 2012) no forma parte del controlador 9.1 , consulte: Parámetros de conexión .
user272735
¿Lo intentaste? Porque no figuraba como parte del controlador anterior, pero aún funcionaba.
Hiro2k
8
Intenté con 9.3-1101-jdbc41 y 9.1, no funciona para mí
Ignacio A. Poletti
@ IgnacioA.Poletti Intente usar el setSchemamétodo JDCB después de crear su conexión. Funciona para mí con un controlador reciente de postgres.
beldaz
77
Resolvimos este problema utilizando también un controlador JDBC diferente (más nuevo). En nuestro caso postgresql-9.4.1209.jdbc42.jartrabajamos junto con una 9.5base de datos y la ?currentSchema=myschemasintaxis.
SebastianH
63

A partir de la versión 9.4 , puede usar el currentSchemaparámetro en su cadena de conexión.

Por ejemplo:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
Distorsión
fuente
48

Si es posible en su entorno, también puede establecer el esquema predeterminado del usuario para su esquema deseado:

ALTER USER user_name SET search_path to 'schema'
chzbrgla
fuente
1
Probablemente sea mejor ALTERAR la base de datos para que el mismo usuario pueda conectarse a diferentes bases de datos con diferentes rutas de búsqueda si es necesario: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska
44

No creo que haya una manera de especificar el esquema en la cadena de conexión. Parece que tienes que ejecutar

set search_path to 'schema'

después de realizar la conexión para especificar el esquema.

Herks
fuente
2
Esto funcionó para mí, específicamente usando la instancia de "Conexión" para ejecutar: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara
Hay una manera de especificar el esquema predeterminado en la cadena de conexión (jdbc uri). Ver las respuestas a continuación.
basilikode
7

DataSource - setCurrentSchema

Al crear instancias de una DataSourceimplementación, busque un método para establecer el esquema actual / predeterminado.

Por ejemplo, en la PGSimpleDataSourcellamada de clase 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_" );  // <----------

Si deja el esquema sin especificar, Postgres por defecto es un esquema nombrado publicdentro de la base de datos. Consulte el manual, sección 5.9.2 El esquema público . Para citar el manual del sombrero:

En las secciones anteriores creamos tablas sin especificar ningún nombre de esquema. Por defecto, tales tablas (y otros objetos) se colocan automáticamente en un esquema llamado "público". Cada nueva base de datos contiene dicho esquema.

Albahaca Bourque
fuente
3
" intenta conectarse a un esquema " - Eso es un poco engañoso. El controlador no se conecta "a un esquema", sino a una base de datos . El esquema utilizado por las consultas depende de la configuración actual desearch_path
a_horse_with_no_name del
3

No olvide SET SCHEMA 'myschema'cuáles podría usar en una Declaración separada

SET SCHEMA 'value' es un alias para el valor SET search_path TO. Solo se puede especificar un esquema utilizando esta sintaxis.

Y desde 9.4 y posiblemente versiones anteriores en el controlador JDBC, hay soporte para el setSchema(String schemaName)método.

beldaz
fuente
3

En Ir con "sql.DB" (tenga en cuenta el search_pathguión bajo):

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

Esto ya fue respondido:

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

Como en respuestas anteriores, la cadena de conexión anterior simplemente funciona.

Lo he comprobado y está bien: https://youtu.be/m0lBUHSLkNM?t=79

(Aunque la respuesta aceptada se dio hace 8 años, se editó hace 1 año ...)

AlexSandu75
fuente
1
¿Cómo es esto diferente de la respuesta aceptada de hace 8 años?
stdunbar
Bueno, en los comentarios también hubo publicaciones que arrojaron algunas dudas de que podría no funcionar,. . Así que probé y publiqué mi prueba como video (soy un miembro nuevo y aún no puedo comentar sobre las respuestas de otros). - también, aunque la respuesta aceptada se dio hace 8 años, se editó hace 1 año. . .
AlexSandu75