gpt4 book ai didi

haskell - 一起使用 Servant、Selda 和 SQLite

转载 作者:行者123 更新时间:2023-12-04 11:45:55 26 4
gpt4 key购买 nike

我已经使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com