我已经使用Haskell一年左右了,它非常棒。我最近开始使用Servant;我想使用像Selda这样的SQL库,这样一切都是类型安全的。(与Elm结合使用时,这真是令人难以置信!:)
这里有一个示例:将Selda与Servant一起使用的https://github.com/dmjio/servant-selda,但仅适用于postgres。在最初的开发过程中,我发现使用SQLite非常有用。
我觉得这应该是可能的,但我似乎找不到任何例子。我试图查看类型签名,以了解如何将SQLite作为池传递;但这有点超出了我的Haskell技能!
有没有使用Selda的经验,或者在Servant中成功使用了另一个类型安全的sql库?我对使用Selda以外的其他库持开放态度;我希望使用UUID作为主键,而Persistent在我尝试这样做时并不太高兴。
谢谢
发布于 2021-09-09 09:42:43
解决方案是(基于https://docs.servant.dev/en/stable/cookbook/using-custom-monad/UsingCustomMonad.html)使用SeldaT作为您的自定义服务monad
最小示例:
{-# LANGUAGE TypeApplications #-}
module Main where
import Control.Exception (bracket)
import Data.Aeson (ToJSON)
import Database.Selda (SeldaT)
import Database.Selda.Backend (SeldaConnection, runSeldaT)
import Database.Selda.SQLite (SQLite, seldaClose, sqliteOpen)
import Network.Wai.Handler.Warp (run)
import Servant (Application, EmptyAPI (EmptyAPI), Get, Handler, HasServer (ServerT), JSON, Proxy (Proxy), emptyServer, hoistServer, serve)
type YourAPI = EmptyAPI -- replace with your API type
yourApi :: Proxy YourAPI
yourApi = Proxy @YourAPI
type AppM = SeldaT SQLite Handler
server :: ServerT YourAPI AppM
server = emptyServer -- replace with your API implementation
nt :: SeldaConnection SQLite -> AppM a -> Handler a
nt = flip runSeldaT
app :: SeldaConnection SQLite -> Application
app conn = serve yourApi $ hoistServer yourApi (nt conn) server
main :: IO ()
main =
bracket
(sqliteOpen "sqlite.db")
seldaClose
(run 3000 . app)请注意,并发支持没有很好的文档记录(并且可能受到支持)。我找到了这个问答,它可能会给出更多关于Haskell What are the rules about concurrently accessing a persistent database中sqlite并发的详细信息。与persistent-sqlite类似,selda-sqlite依赖于direct-sqlite作为底层库。
https://stackoverflow.com/questions/57996516
复制相似问题