Esqueletoの利用方法(Experimental版)
Esqueletoのバージョン3系で書き方が二つに分かれた模様
- Legacy モジュール
- Experimental モジュール
esqueletoのバージョン3系をインストールした場合、バージョン2系でかかれたコードについては import 文を
import Database.Esqueleto.Legacy
と書き直して古い構文を利用する必要がある。
Experimentalの利用方法
join系の書き方がLegacy版と違っている、Legacy版のjoinは結合先のデータがない場合、Maybeでとらないとランタイム エラーになるケースがあった。
Experimental版の書き方にすることによって、これらがコンパイルの時点で検出できることが利点かなと記憶してる(多分…)
利用方法は、 GHC拡張 を追加
{-# LANGUAGE TypeApplications #-}
TypeApplications拡張 は関数が多態性関数であり、1つ以上の型引数を特定の型にインスタンス化できるようになる拡張です、 @UsrMember のように型を指定することができるようになる。
import宣言をExperimentalで宣言して
import qualified Database.Esqueleto.Experimental
そしてコードを以下のように書く
getUsers :: Param -> HandlerFor App ([(E.Entity UsrMember, E.Value Text, E.Value Int)], Int)
= runDB $ do
getUsers p let pagePerLine = fromIntegral $ unPagePerLine p
= fromIntegral $ unPageNum p
page = fromIntegral $ unReqId p
reqId = [1, 2]
typeIds = (unAgeFrom p, unAgeTo p)
(ageFrom, ageTo) = do
baseQuery E.:& usrImage E.:& usrAgeView) <-
(usrMember $ E.table @UsrMember
E.from `E.InnerJoin` E.table @UsrImage
`E.on` (\(usrMember E.:& usrImage) ->
E.^. UsrMemberUsrMemberId E.==. usrImage E.^. UsrImageUsrId)
usrMember `E.InnerJoin` E.table @UsrAgeView
`E.on` (\(usrMember E.:& _ E.:& usrAgeView) ->
E.^. UsrMemberUsrMemberId E.==. usrAgeView E.^. UsrAgeViewUid)
usrMember $ do
E.where_ let reqQuery = usrMember E.^. UsrMemberReqId E.==. E.val reqId
= usrAgeView E.^. UsrAgeViewAge E.>=. E.val ageFrom
ageQuery E.&&. usrAgeView E.^. UsrAgeViewAge E.<=. E.val ageTo
E.^. UsrMemberTypeId `E.in_` E.valList typeIds
usrMember E.&&. (if reqId > 0 then reqQuery else E.val True)
E.&&. (if ageFrom > 0 && ageTo > 0 then ageQuery else E.val True)
E.&&. usrImage E.^. UsrImageImageDiv E.==. E.val 2
return (usrMember, usrImage E.^. UsrImageFileName, usrAgeView E.^. UsrAgeViewAge)
= do r <- baseQuery; E.offset (pagePerLine * page); E.limit pagePerLine; return r
baseQueryPage <- P.length <$> E.select baseQuery
cnt <- E.select baseQueryPage
s return (s, cnt)
基本的にはさほど変わりませんので、今後はこちらの方が良いと思います。
githubサンプルコード はこちらに置いてあります。
Legacy版 はこちらでございます。
Posted on 2023-11-12 14:58:08