JDBCでスキーマを指定してPostgreSQLのDBに接続する

PostgreSQLのアイキャッチ PostgreSQL
PostgreSQL

何故そんなことがしたいのか

特に何も設定をせずにPostgreSQLで

select * from test;

というSQLを発行すると、

select * from public.test;

というようにpublicというスキーマのtestテーブルを参照します。

今回、上記のような特に何も設定していない本番環境をリプレースする機会がありました。
その際にスキーマをDB作成時にデフォルトで作成されるpublicではなく別途作成し、そのスキーマ内に同じ構成で作成することとなりました。
テーブル、ビューの構成は同じなのでプロジェクト内で発行する全てのSQLは同じでOKなワケです。ただ、スキーマの指定だけを全てのSQLで指定してあげる必要がある・・・
プロジェクトではS2JTAJDBCを利用していたので、これらの設定で解決を試みます。

JDBC接続文字列で対応

PostgreSQL JDBC Driverの公式ドキュメントを見てみると下記のような記載がありました。

currentSchema (String) Default null
Specify the schema (or several schema separated by commas) to be set in the search-path. This schema will be used to resolve unqualified object names used in statements over this connection.

https://jdbc.postgresql.org/documentation/use/

雑に要約するとこの指定を行った接続では非修飾オブジェクトの名前解決に指定したスキーマ名を使用してくれるとのことです。
ということで、DB接続の設定ファイルjdbc.diconの接続文字列にcurrentSchemaの指定を追加します。

jdbc.dicon

これにてプロジェクトの全てのSQLでスキーマを指定するような振る舞いとなってくれました。
たとえば[スキーマ]にtargetschemaと指定したとすると

select * from test;

と発行したSQLが

select * from targetschema.test;

と同じようになります。

当ブログの内容はできる限り正確な情報を提供するよう努めていますが、利用にあたっては自己責任でお願いいたします。
掲載内容に基づく操作・設定などによって生じたトラブルや損害について、当サイトは一切の責任を負いません。
ちゅんろぐをフォローする

コメント

タイトルとURLをコピーしました