首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用Servant、Selda和SQLite

同时使用Servant、Selda和SQLite
EN

Stack Overflow用户
提问于 2019-09-18 23:44:30
回答 1查看 168关注 0票数 5

我已经使用Haskell一年左右了,它非常棒。我最近开始使用Servant;我想使用像Selda这样的SQL库,这样一切都是类型安全的。(与Elm结合使用时,这真是令人难以置信!:)

这里有一个示例:将Selda与Servant一起使用的https://github.com/dmjio/servant-selda,但仅适用于postgres。在最初的开发过程中,我发现使用SQLite非常有用。

我觉得这应该是可能的,但我似乎找不到任何例子。我试图查看类型签名,以了解如何将SQLite作为池传递;但这有点超出了我的Haskell技能!

有没有使用Selda的经验,或者在Servant中成功使用了另一个类型安全的sql库?我对使用Selda以外的其他库持开放态度;我希望使用UUID作为主键,而Persistent在我尝试这样做时并不太高兴。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-09-09 09:42:43

解决方案是(基于https://docs.servant.dev/en/stable/cookbook/using-custom-monad/UsingCustomMonad.html)使用SeldaT作为您的自定义服务monad

最小示例:

代码语言:javascript
复制
{-# 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作为底层库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57996516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档