haskell - 一起使用 Servant、Selda 和 SQLite

标签 haskell servant

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

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

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

有没有人使用 Selda 的经验,或者在 Servant 上使用另一个类型安全的 sql 库取得了成功?我愿意使用 Selda 以外的其他库;我想使用 UUID 作为主键,当我尝试这个时,持久性不太高兴。

谢谢

最佳答案

解决方法是使用SeldaT作为您的自定义仆人 monad(基于 https://docs.servant.dev/en/stable/cookbook/using-custom-monad/UsingCustomMonad.html)
最小的例子:

{-# 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)
请注意,并发支持没有得到很好的记录(并且可能支持)。发现这个 q/a 可能会提供有关 Haskell 中 sqlite 并发的更多详细信息 What are the rules about concurrently accessing a persistent database .类似于 persistent-sqlite , selda-sqlite取决于 direct-sqlite作为底层库。

关于haskell - 一起使用 Servant、Selda 和 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57996516/

相关文章:

file - 确保及时关闭文件

haskell - 为什么单子(monad)在组合下不关闭?

haskell - 如何迭代具有相同类型的记录类型中的所有元素(记录类型的纯函数迭代器)

api - 了解 Servant 论文中的 'echo' 服务示例 API

web-services - Haskell Servant - 有没有办法组合 API 类型?

haskell - 哪些语言扩展可以写入 "class A (B c) => D c where ..."?这个类型类声明的含义是什么?

haskell - 在 Haskell 中使用 Data.Reflection 返回具体化类型

haskell - 使用 nginx 通过 https 运行 Haskellservant

haskell - Haskell Servant 的部分反向代理

haskell - 带有仆人的数据库支持的 REST API?