昨日の三島Haskell無名関数の会(mishima.hs)で「PersistentのKeyってどうやって作るの?」っていう話になって、宿題として持ち帰ったので朝から調べていた。
Keyは
type Key val = KeyBackend (PersistEntityBackend val) val
で、KeyBackendのデータコンストラクタがKeyなので、PersistValueのデータコンストラクタで包めばいいみたい。
ひとつレコードを作って、キーを指定して年齢を変更した後、キーでレコードを取ってきて年齢が変わっていることを確認するサンプル。SQLitのキーがInt64なのでこのサンプルではPersistInt64データコンストラクタを使っている。
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-} {-# LANGUAGE GADTs, FlexibleContexts #-} import Database.Persist import Database.Persist.Sqlite import Database.Persist.TH import Control.Monad.IO.Class (liftIO) import Database.Persist.Store share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist| Person name String age Int Maybe loc String default="Japan" deriving Show |] main :: IO () main = withSqliteConn "test.db" $ runSqlConn $ do runMigration migrateAll kzfmId <- insert $ Person "kzfm" (Just 20) "Fuji" liftIO $ print kzfmId kzfm <- getJust kzfmId liftIO $ print kzfm kzfm2 <- replace (Key (PersistInt64 1)) (kzfm {personAge = Just 36}) liftIO $ print kzfm2 kzfm3 <- getJust (Key (PersistInt64 1)) liftIO $ print (personAge kzfm3)
どういうメソッドがあるのかはDatabase.Persist の関数群を簡単に説明が参考になる。