Est-il possible de spécifier le schéma lors de la connexion à postgres avec JDBC?

Réponses:

204

Je sais que cela a déjà été répondu, mais je viens de rencontrer le même problème en essayant de spécifier le schéma à utiliser pour la ligne de commande liquibase.

Mise à jour À partir de JDBC v 9.4, vous pouvez spécifier l'URL avec le nouveau paramètre currentSchema comme suit:

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

Apparaît sur la base d'un correctif antérieur:

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

Quelle URL proposée est comme ça:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
Hiro2k
la source
2
Oui mais au moment de l'écriture (fin 2012) il ne fait pas partie du pilote 9.1 , voir: Paramètres de connexion .
user272735
Est-ce que tu l'as essayé? Parce qu'il n'était pas répertorié dans le pilote précédent, mais cela fonctionnait toujours.
Hiro2k
8
Essayé avec 9.3-1101-jdbc41 et 9.1, ne fonctionne pas pour moi
Ignacio A. Poletti
@ IgnacioA.Poletti Essayez d'utiliser la setSchemaméthode JDCB après avoir créé votre connexion. Fonctionne pour moi avec un pilote postgres récent.
beldaz
7
Nous avons résolu ce problème en utilisant également un pilote JDBC différent (plus récent). Dans notre cas, postgresql-9.4.1209.jdbc42.jartravaillé avec une 9.5base de données et la ?currentSchema=myschemasyntaxe.
SebastianH
63

Depuis la version 9.4 , vous pouvez utiliser le currentSchemaparamètre dans votre chaîne de connexion.

Par exemple:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
Distorsion
la source
48

Si cela est possible dans votre environnement, vous pouvez également définir le schéma par défaut de l'utilisateur sur le schéma souhaité:

ALTER USER user_name SET search_path to 'schema'
chzbrgla
la source
1
Il est probablement préférable d'ALTER la base de données elle-même afin que le même utilisateur puisse se connecter à différentes bases de données avec différents chemins de recherche si besoin est: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska
44

Je ne pense pas qu'il existe un moyen de spécifier le schéma dans la chaîne de connexion. Il semble que vous devez exécuter

set search_path to 'schema'

une fois la connexion établie pour spécifier le schéma.

Herks
la source
2
Cela a fonctionné pour moi, en utilisant spécifiquement l'instance "Connection" pour exécuter: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara
Il existe un moyen de spécifier le schéma par défaut dans la chaîne de connexion (jdbc uri). Voir les réponses ci-dessous.
basilikode
7

DataSource - setCurrentSchema

Lors de l'instanciation d'une DataSourceimplémentation, recherchez une méthode pour définir le schéma actuel / par défaut.

Par exemple, lors de l' PGSimpleDataSourceappel 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_" );  // <----------

Si vous laissez le schéma non spécifié, Postgres utilise par défaut un schéma nommé publicdans la base de données. Voir le manuel, section 5.9.2 Le schéma public . Pour citer le manuel du chapeau:

Dans les sections précédentes, nous avons créé des tables sans spécifier de nom de schéma. Par défaut, ces tables (et autres objets) sont automatiquement placées dans un schéma nommé «public». Chaque nouvelle base de données contient un tel schéma.

Basil Bourque
la source
3
" tente de se connecter à un schéma " - C'est un peu trompeur. Le pilote ne se connecte pas "à un schéma", mais à une base de données . Le schéma utilisé par les requêtes dépend du paramètre actuel desearch_path
a_horse_with_no_name
3

N'oubliez pas SET SCHEMA 'myschema'ce que vous pouvez utiliser dans une déclaration distincte

SET SCHEMA 'value' est un alias pour SET search_path TO value. Un seul schéma peut être spécifié à l'aide de cette syntaxe.

Et depuis 9.4 et peut-être les versions antérieures sur le pilote JDBC, il existe un support pour la setSchema(String schemaName)méthode.

Beldaz
la source
3

En Go avec "sql.DB" (notez le search_pathavec trait de soulignement):

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

Cela a déjà été répondu:

jdbc: postgresql: // localhost: 5432 / ma base de données? currentSchema = myschema

Comme dans les réponses précédentes, la chaîne de connexion ci-dessus fonctionne simplement.

J'ai vérifié, et c'est OK: https://youtu.be/m0lBUHSLkNM?t=79

(Bien que la réponse acceptée ait été donnée il y a 8 ans, elle a été modifiée il y a 1 an...)

AlexSandu75
la source
1
En quoi est-ce différent de la réponse acceptée d'il y a 8 ans?
stdunbar
Eh bien, dans les commentaires, il y avait aussi des messages qui jetaient des doutes sur le fait que cela pourrait ne pas fonctionner. . J'ai donc testé et posté mon test sous forme de vidéo (je suis un nouveau membre et je ne peux pas encore commenter les réponses des autres). - aussi, bien que la réponse acceptée ait été donnée il y a 8 ans, elle a été modifiée il y a 1 an. . .
AlexSandu75