Yesod Advent Calendar 2016|14日目の投稿です。
Webサーバ起動時にDBに対して処理を行いたいことがあります。
例えば設定値テーブルにデフォルト値を突っ込んだり、システム管理者を登録したり・・・
Yesodでこのような処理を行う場所は、Application.hs
の中のmakeFoundation
関数が良さそうです。
書き方
Yesodのテンプレートで作成したmakeFoundation
関数の中には次のような処理があります。
Application.hs
-- Perform database migration using our application's logging settings.
runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
この処理を真似して新しい処理を追加することで、起動時にオリジナルのDBアクセス処理を追加することが出来ます。
例えば以下のように。
Application.hs
-- Perform database migration using our application's logging settings.
runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
-- DB処理を追加
runLoggingT (runSqlPool (initializeDbData) pool) logFunc
initializeDbData
関数の中では、selectList
など、 Database.Persist
モジュールの関数が使えます。Modelも展開されているので、Handler関数の中と同じ感覚でDBアクセスが書けます。
Applicatin.hs
initializeDbData = do
l::(Maybe (Entity SystemConfiguration)) <- selectFirst [] []
case l of
Nothing -> do
now <- liftIO $ getCurrentTime
sc <- pure $ SystemConfiguration {
_systemConfigurationValue = "XXXX"
}
_ <- insert sc
pure ()
Just _ -> pure ()
以上です。