MPのご利用は計画的に

だいたい自分用のメモ

DbSetupでPostgreSQLの範囲型とJSONデータ型を扱う

概要

テストでよく使うDbSetupで、PostgreSQLの範囲型とJSONデータ型をどう扱うのか試してみました。

環境

  • Kotlin 1.2.60
  • JUnit 5.2.0(jupiter)
  • Maven 3.5.4
  • DbSetup 2.1.0

JSONデータ型

テーブルを準備

JSONデータ型をもったテーブルを作ります。 JSONデータ型にはjsonjsonbの2種類ありますが、今回は検索に有利なjsonbを使います。

CREATE TABLE jsonb (
    id INT PRIMARY KEY,
    value JSONB NOT NULL
);

DbSetupから文字列としてINSERT

普通の文字列としてINSERTしてみます

val destination = DriverManagerDestination(url, username, password)

val insert = Operations.insertInto("json")
        .columns("id", "value")
        .values(1L, """{ "hoge": "fuga" }""")
        .build()
DbSetup(destination, insert).launch()

ダメでした。残念ながら型が違うということでエラーになります。

com.ninja_squad.dbsetup.DbSetupRuntimeException: org.postgresql.util.PSQLException: ERROR: column "value" is of type jsonb but expression is of type character varying
  ヒント: You will need to rewrite or cast the expression.

SQLをそのまま実行する

DbSetupにはJSONデータ型への変換が用意されていないようなので、素のSQLを実行するように変更します。

val insert = Operations.sql("""
    INSERT INTO jsonb ( id, value )
    VALUES ( ${1L}, '{ "hoge": "fuga" }')
""")
DbSetup(destination, insert).launch()

これはうまくいきました。

範囲型

テーブルを準備

範囲型にも何種類かありますが、daterangeを使います

CREATE TABLE range (
    id INT PRIMARY KEY,
    value daterange NOT NULL
);

DbSetupから文字列としてINSERT

こちらも普通の文字列としてINSERTしてみます。

val insert = Operations.insertInto("range")
        .columns("id", "value")
        .values(1L, "[2018-01-01, 2018-01-31]")
        .build()
DbSetup(destination, insert).launch()

やはりダメでした。

com.ninja_squad.dbsetup.DbSetupRuntimeException: org.postgresql.util.PSQLException: ERROR: column "value" is of type daterange but expression is of type character varying
  ヒント: You will need to rewrite or cast the expression.

SQLをそのまま実行する

JSONの時と同じように素のSQLでINSERTしてみます。

val insert = Operations.sql("""
    INSERT INTO range ( id, value )
    VALUES ( ${1L}, '[2018-01-01, 2018-01-31]')
""")
DbSetup(destination, insert).launch()

こちらもうまくいきました。




テストで便利なDbSetupですが、データベース固有の方言をサポートしていないところもあるようです。
そんな時は純粋にSQLを実行するのが良いようです。