2020年1月3日金曜日

esqueletoでSQL関数

Esqueletoで関数


Yesodやってて、関数を使う必要性があったのですがいまいちやり方が曖昧だったので調べてみた、案外簡単だった。

面倒くさいのでだいぶはしょる、Handlerから使う想定、kusoをした時刻がNULLなら「1800-01-01 00:00:00 UTC」にする。


import qualified Database.Esqueleto as E
import qualified Database.Esqueleto.Internal.Sql as E

...
...
kusoTime :: HandlerFor App ([E.Value UTCTime])
kusoTime = runDB $ do
    result <- E.select $ E.from $ \table -> do
        return $ coalesceDate (table E.^. KusoLastKusoTime)
    return result
        where
            coalesceDate :: E.SqlExpr (E.Value (Maybe UTCTime)) ->
 E.SqlExpr (E.Value UTCTime)
            coalesceDate t = E.unsafeSqlFunction "COALESCE" (t, defDate')
            defDate :: E.SqlExpr (E.Value UTCTime)
            defDate = E.unsafeSqlValue "TIMESTAMP \'1800-01-01 00:00:00 UTC\'"
こう書くと
SELECT COALESCE("kuso"."last_kuso_time", TIMESTAMP '1800-01-01 00:00:00 UTC') FROM "kuso"
こんなSQLが出力される、2020年。