2015年4月18日土曜日

[PostgreSQL]ドメインを定義する

ドメイン定義を使用することで、よく利用する列定義をテーブルごとにするのではなくドメインの定義に集約することができる。

ドメインの定義方法

create domainを使用してドメインを作成する。

-- not null制約のついた、varchar(5)のドメインを作成
CREATE DOMAIN test_domain VARCHAR(5) NOT NULL;

-- ドメインの定義内容の確認
                              ドメイン一覧
  スキーマ   |    名前     |          型          |  修飾語  | チェック
-------------+-------------+----------------------+----------+----------
 test_schema | test_domain | character varying(5) | not null |


ドメイン型のカラムの作成

-- テーブルの作成
CREATE TABLE TEST_TABLE (
    ID   SERIAL NOT NULL,
    NAME TEST_DOMAIN,   -- 型にドメインを指定したカラム
    PRIMARY KEY (ID)
)

-- テーブルの定義の確認
-- ドメインに設定しているnot null制約は確認できない
                      テーブル "test_schema.test_table"
  列  |     型      |                         修飾語
------+-------------+---------------------------------------------------------
 id   | integer     | not null default nextval('test_table_id_seq'::regclass)
 name | test_domain |
インデックス:
    "test_table_pkey" PRIMARY KEY, btree (id)

データをインサートしてみる

-- 有効なデータの場合正しくinsertできる
insert into test_table (name) values ('12345');
INSERT 0 1

-- 桁数オーバの場合エラーになる
insert into test_table (name) values ('123456');
ERROR:  value too long for type character varying(5)

-- 制約違反の場合エラーになる
insert into test_table (name) values (null);
ERROR:  domain test_domain does not allow null values

2015年4月9日木曜日

[PostgreSQL]JDBCの接続URLでカレントスキーマを指定する

JDBCで接続先のURLを指定するときに、接続パラメータでカレントのスキーマを指定する。

URLのフォーマット

カレントスキーマの接続パラメータは、currentSchemaなので、以下のようにURLの最後に指定する。

jdbc:postgresql://localhost/test?currentSchema

実行例

// 以下のコードの場合、カレントスキーマはtest_schemaとなる
dataSource.setUrl("jdbc:postgresql://localhost/test?currentSchema=test_schema");
try (Connection connection = dataSource.getConnection()) {
    final String schema = connection.getSchema();
    System.out.println("schema = " + schema);       // -> schema = test_schema
}

2015年4月2日木曜日

[jdbc]カレントのスキーマ名を取得する

現在の接続のカレントスキーマ名を得る方法。

Connectionインタフェースにカレントスキーマ名を取得するメソッド(getSchema)があるのでそれを使えばよい。
※getSchemaは、Java7から追加された機能。

サンプルコード

        final Connection connection = dataSource.getConnection();
        final String schema = connection.getSchema();
        System.out.println("schema = " + schema);

[Spring]MockMVCとJsonPathをつかたテストでjava.lang.NoClassDefFoundError: com/jayway/jsonpath/InvalidPathExceptionが出た場合の対処


エラー内容

java.lang.NoClassDefFoundError: com/jayway/jsonpath/InvalidPathException
 at org.springframework.test.web.servlet.result.JsonPathResultMatchers.(JsonPathResultMatchers.java:44)
 at org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath

対処方法

依存ライブラリにjson-pathを追加します。

Gradleの場合には、以下のようになります。
    testCompile "com.jayway.jsonpath:json-path:2.0.0"