DbSetupでPostgreSQLの範囲型とJSONデータ型を扱う
概要
テストでよく使うDbSetupで、PostgreSQLの範囲型とJSONデータ型をどう扱うのか試してみました。
環境
JSONデータ型
テーブルを準備
JSONデータ型をもったテーブルを作ります。
JSONデータ型にはjson
とjsonb
の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を実行するのが良いようです。