JDBCでpostgresに接続するときにスキーマを指定することは可能ですか?


回答:


204

私はこれが既に回答されていることを知っていますが、liquibaseコマンドラインに使用するスキーマを指定しようとして同じ問題に遭遇しました。

更新 JDBC v 9.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

提案されたURLはそうです:

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

2
はい。ただし、執筆の時点では(2012年後半)9.1ドライバーの一部ではありません。「接続パラメーター」を参照してください。
user272735 2012

やってみましたか?以前のドライバーの一部としてリストされていませんが、それでも機能しました。
Hiro2k 2012

8
9.3-1101-jdbc41と9.1を試してみましたが、うまくいきません
イグナシオA.ポレッティ

@ IgnacioA.Poletti setSchema接続を作成した後、JDCB メソッドを使用してみてください。最近のpostgresドライバーで動作します。
beldaz 2015年

7
この問題は、別の(新しい)JDBCドライバーも使用することで解決しました。私たちの場合postgresql-9.4.1209.jdbc42.jar9.5データベースと?currentSchema=myschema構文と一緒に動作しました。
SebastianH

63

とおり、バージョン9.4は、使用することができますcurrentSchemaあなたの接続文字列内のパラメータを。

例えば:

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

48

ご使用の環境で可能であれば、ユーザーのデフォルトスキーマを目的のスキーマに設定することもできます。

ALTER USER user_name SET search_path to 'schema'

1
おそらく、データベース自体を変更して、同じユーザーが必要に応じて異なるsearch_pathを使用して異なるデータベースに接続できるようにするほうがよいでしょう。ALTER DATABASE dbname SET search_path TO public、schemaname;
アラスカ

44

接続文字列でスキーマを指定する方法があるとは思いません。実行する必要があるようです

set search_path to 'schema'

スキーマを指定するために接続が行われた後。


2
これは私にとってはStatement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
うまくいき

接続文字列(jdbc uri)でデフォルトのスキーマを指定する方法があります。以下の回答をご覧ください。
バシリコーデ


7

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 Sc​​hemaを参照してください。帽子のマニュアルを引用するには:

前のセクションでは、スキーマ名を指定せずにテーブルを作成しました。デフォルトでは、このようなテーブル(およびその他のオブジェクト)は自動的に「public」というスキーマに入れられます。すべての新しいデータベースには、そのようなスキーマが含まれています。


3
スキーマへの接続を試みます」-これは少し誤解を招きます。ドライバは「スキーマ」に接続するのではなく、データベースに接続します。クエリで使用されるスキーマは、search_path
-a_horse_with_no_nameの

3

SET SCHEMA 'myschema'別のステートメントで使用できることを忘れないでください

SET SCHEMA 'value'は、SET search_path TO値のエイリアスです。この構文を使用して指定できるスキーマは1つだけです。

また、JDBCドライバーの9.4および場合によっては以前のバージョンから、このsetSchema(String schemaName)メソッドがサポートされています。


3

Go with "sql.DB"(search_pathwith underscoreに注意):

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

0

これはすでに回答されています:

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

以前の回答と同様に、上記の接続文字列はそのまま機能します。

チェックしましたが、問題ありません:https : //youtu.be/m0lBUHSLkNM?t=79

(受け入れられた回答は8年前に与えられましたが、それは1年前に編集されました...)


1
これは、8年前に承認された回答とどう違うのですか?
stdunbar '20

まあ、コメントには、それがうまくいかないかもしれないという疑問を投げかけている投稿もありました。。だから私はテストし、ビデオとして自分のテストを投稿しました(私は新しいメンバーであり、他の人の答えについてはまだコメントできません)。-また、承認された回答は8年前に出されましたが、1年前に編集されました。。。
AlexSandu75
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.