前回の復習
前回 は、
- 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
型に設定できるじゃーん」と思ったのですが、ダメでした。
どうしてうまくいかないのか、理由はわかりません...