一起使用 Servant、Selda 和 SQLite

Posted

技术标签:

【中文标题】一起使用 Servant、Selda 和 SQLite【英文标题】:Using Servant, Selda, and SQLite together 【发布时间】:2019-09-18 15:44:30 【问题描述】:

我已经使用 Haskell 大约一年了,这太棒了。我最近开始使用Servant;我想使用像 Selda 这样的 SQL 库,这样一切都是类型安全的。 (与 Elm 结合起来真是不可思议!:))

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

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

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

谢谢

【问题讨论】:

当然不是答案,但是:为什么 sqlite 在您的开发过程中更容易?我发现docker run -p 5432 postgres 非常干净,允许我使用与生产相同的 API。是资源限制吗?平台问题? 嗨,Thomas,这是我的选择;我认为这是最有意义的。 【参考方案1】:

解决方案是使用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 What are the rules about concurrently accessing a persistent database 中提供有关 sqlite 并发的更多详细信息。与persistent-sqlite 类似,selda-sqlite 依赖于direct-sqlite 作为底层库。

【讨论】:

以上是关于一起使用 Servant、Selda 和 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

tars framework 源码解读 servant部分章节。客户端部分。完整的tars调用流程详解

为什么Haskell说这是模棱两可的?

2018沈阳网络赛不太敢自称官方的出题人题解

在Kali linux下使用docker配置sqli-labs(国内源的配置和系统软件更新)

Windows上DVWA和sqli-labs部署

Windows上DVWA和sqli-labs部署