gpt4 book ai didi

Haskell:HDBC、连接状态和可能的池

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

比如说,我有一个简单的应用程序,它使用 HDBC 与数据库进行交互。它可以是快照应用程序或命令行应用程序。我想对此有一个通用的看法 - 不是快照或任何具体的。
一个很好的例子是“Real World Haskell”的第 22 章。

所以我会在一个单独的 DB.hs 文件中隐藏所有与 SQL 相关的函数,如连接、saveArticle、getArticle 等。所有 DB 函数都将连接句柄作为参数。

现在,我将如何启动一次连接并将其置于一种状态,以便所有这些数据库功能只使用它而不单独启动连接?
这可能吗?也许我想错了或者考虑到了 OO 概念但是......我想“初始化”我的连接(就像你会在 OO 中初始化一个对象)。
我不希望每个数据库函数都创建和关闭新连接。

我是否必须创建一个池并将池作为参数而不是连接句柄传递给函数?最简单的例子是什么?

无论是池还是连接句柄,我如何将它置于一种状态,以便我的功能在需要时捕获它,而不是一直重复“打开”和“关闭”?如果是,它是如何正确完成的?

我是否需要创建一个池并将其置于一个状态,以便函数只查询池以获取来自全局状态的连接?再次,示例将不胜感激。

谢谢。

最佳答案

没有模块状态或应用程序状态之类的东西,因此您必须找到其他策略。我非常推荐一个 reader monad,环境保持 db 连接。这将在某些功能中花费您一些返回,但会非常可靠。

下面是一个简单的伪 Haskell 示例。

type AppState = AppState { dbcon :: DatabaseConnection }

type App = ReaderT AppState IO

main = do
db <- makeNewDbConnection
runReaderT getDbTableCount $ AppState db

getDbTableCount :: App Integer
getDbTableCount = do
(count:_) <- runDb "select count(*) from table;"
return $ read count

runDb :: String -> App [String]
runDb req = do
con <- asks dbcon
return $ dbQuery con req

关于Haskell:HDBC、连接状态和可能的池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832876/

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