HRR から PostgreSQL 操作してみた【Part2】

2019-03-20

前回の復習

前回 は、

  • PostgreSQL の Docker コンテナを用意
  • テーブルに対応したデータ型を HRR に生成してもらう
  • HRR から DB を操作してみる

ということをやりました。今回はちょっと細かめの話題です。

やりたいこと

前回 HRR が生成した Country 型をもう一度見てみましょう。

data Country
  = Country {Entity.Country.id :: !GHC.Int.Int32,
             countryName :: !String}

主キーである id カラムのデータ型が Int32 になっています。これを Int にするのが今回やりたいことです。

方法

Template Haskell によって Country 型を生成しているコードを修正します。

-- 前回(抜粋)

import Database.HDBC.Query.TH          (defineTableFromDB)
import Database.HDBC.Schema.PostgreSQL (driverPostgreSQL)
import DB                              (connectPG)
import GHC.Generics                    (Generic)

$(defineTableFromDB
    connectPG
    driverPostgreSQL
    "public"
    "country"
    [''Show, ''Generic])
-- 今回(抜粋)

import Database.HDBC.Query.TH          (defineTableFromDB') -- 変更
import Database.HDBC.Schema.PostgreSQL (driverPostgreSQL)
import DB                              (connectPG)
import GHC.Generics                    (Generic)

$(defineTableFromDB'
    connectPG
    driverPostgreSQL
    "public"
    "country"
    [("id", [t|Int|])] -- 追加
    [''Show, ''Generic])

これだけです。カラムのデータ型が指定できる defineTableFromDB' という関数を使えばいいだけでした。

試したけどうまくいかなかった方法

Haskell 入門にはドライバーで設定する方法が書かれていました。それは次のような感じです。

$(defineTableFromDB
    connectPG
    driverPostgreSQL { typeMap = [("integer", [t|Int|])] }
    "public"
    "country"
    [''Show, ''Generic])

これなら、「PostgreSQL の integer 型を一括で Haskell の Int 型に設定できるじゃーん」と思ったのですが、ダメでした。

どうしてうまくいかないのか、理由はわかりません...