问题标签 [hasql]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
282 浏览

haskell - Hasql的session和IO

我写了一个函数

它接受 Web 请求并构建响应(根据需要咨询数据库)。为了实际发送响应,我做了一个包装器

我将此函数传递给WarprunSettings永久循环并处理请求:

然而,这真的很糟糕,因为它为每个请求创建一个新会话,这违背了连接池和准备好的语句的目的。

我想打电话给runSettings里面H.session而不是反过来。但是runSettings有一个签名Settings -> Application -> IO (),一旦进入IO我就无法访问会话。有没有办法回到里面Session b m r

这是来自私人电子邮件的问题的转贴。

0 投票
1 回答
127 浏览

postgresql - Hasql Session 的返回值变量卡在特定类型上?

我试图在我的 Spock 应用程序之外连接到 Postgres 一次,但我似乎无法使用具有多种返回类型的 Hasql 会话句柄。

我的主应用程序相当简单,但无法编译。

如果我注释掉printAHasqlStringor printAccountCount,它会编译并工作(在没有另一个运行时两者都工作)。

printAccountCount执行返回 Int 的查询,并printAHasqlString运行 Text 查询。两者都只是打印结果,并返回一个IO ().

但是当我尝试在同一个应用程序中运行这两个查询时,数据类型r中的类型变量Session被锁定,并且无法与第二个进行编译。

错误信息:

更新错误

在下面的一些帮助之后 - 我遇到了一个新错误:

如何让该类型变量在调用之间保持灵活?

完整(更新)代码:https ://gist.github.com/cschneid/4174addefb254a517f35

0 投票
0 回答
60 浏览

servant - 我如何访问 :: BasicAuthCheck 用户内部的 :: Hasql.Pool.Pool ?

我通常通过作为参数传递:: Hasql.Pool.Poolserve函数作为run参数main :: IO ()

但是自从我开始计划使用:: BasicAuthCheck User身份验证后,我就开始需要:: Hasql.Pool.Pool里面:: BasicAuthCheck User包含:: BasicAuthData -> IO (BasicAuthResult User).

:: Hasql.Pool.Pool我目前的解决方法是在内部创建另一个:: BasicAuthData -> IO (BasicAuthResult User)并使用它来验证用户。

有没有比创建另一个连接池更优雅的方法?

0 投票
1 回答
160 浏览

postgresql - Hasql: Error from variable substitution in 'SET' statement

I'm trying to write a parameterized statement with Hasql to set a variable in PostgreSQL.

The result from the above is:

Adding single quotes e.g.

Gives this result when I run a query using the variable:

Which does make sense since the organization_id is a bigint / int8.

Hard-coding the $1 value in either format works. I've tried different Hasql types e.g. E.text and E.unknown and that does not work.


Update: Using the more primitive execParams function from postgresql-libpq.

Unquoted variable gives FatalError result. Single-quoted variable gives CommandOk, but is wrong type (not bigint) for later queries.

0 投票
1 回答
242 浏览

postgresql - 为 Hasql 查询编码参数列表

我试图让Hasql为“选择......在哪里”查询编码一个列表。如果我使用contramanyfrom contravariant-extras,它会进行类型检查,但在运行时出现语法错误。

不能对参数列表进行编码吗?

0 投票
1 回答
99 浏览

haskell - Hasql:编码求和类型

如何使用 Hasql 对以下 sum-type 进行编码?我试图创建一个编码器sumValue :: Value SumValue,但我无法进行模式匹配。例如,我想SumBoolHasql.Encoders.boolSumCharwith编码Hasql.Encoders.char

0 投票
1 回答
106 浏览

sql - 如何让 Haskell 在编译时检查 SQL?

我知道它可以完成,但我无法让它工作。我仍然在 Haskell 中找到自己的脚。

我尝试使用 postgresql-typed,但它不会编译。他们不启用 QuasiQuotes 扩展,所以我不明白他们的代码将如何编译。useTPGDatabase它也因语句错误而失败。我从 Github 克隆了库的源代码,但他们的测试无法使用堆栈进行编译,并且出现完全相同的错误。

我考虑过使用 hasql-th,但它不在 stackage.org 上,它立即将其放入“太难的篮子”。我考虑过改用nix,但这似乎更加努力。

有人有一个可靠的方法来让一个在 Haskell 编译时对 SQL 进行类型检查的环境工作吗?

0 投票
1 回答
67 浏览

parsing - 使用解析器之类的东西使用 Hasql 语句输出

我有一个应用程序,它使用一些深度嵌套的记录结构对数据域进行建模。一个人为但类似的例子是这样的:

我发现当使用 Hasql(或者更准确地说是 Hasql-TH)编写查询时,我最终得到了这个巨大的函数,它需要一个巨大的元组,并通过有效地先使用这个元组尾部并构造这些嵌套记录来构造我的记录类型,然后最终将它们放在一个大类型中(包括转换一些原始值等)。它最终看起来像这样:

编写和维护/重构这有点烦人,我正在考虑尝试使用Control.Applicative. 这让我想到这本质上是一种解析器(有点像 Megaparsec),我们正在使用输入流,然后想要组合解析函数,这些函数从该流中获取一些“令牌”并返回包装在 Parsing Functor 中的结果(我认为这真的应该是一个 Monad)。唯一的区别是,由于这些结果是嵌套的,它们还需要使用以前解析器的输出(尽管实际上您也可以使用 Megaparsec 和使用 来做到这一点Control.Applicative)。这将允许更小的函数mkCountry, mkTown,mkAuthor等可以与<*>和组成<$>

所以,我的问题基本上是双重的:(1)对于这种现实世界的应用程序,这是一种合理的(甚至是常见的)方法,还是我错过了某种明显的优化,可以让这段代码更加可组合;(2)如果我要实现这个,是使 Megaparsec 适应工作的好方法(基本上是为我认为的查询结果编写标记器),或者编写一个包含查询结果和输出的数据类型会更简单值然后添加MonadApplicative实例定义?

0 投票
0 回答
85 浏览

postgresql - 如何通过所有 Servant api Handlers 传递连接池(Hasql.Pool)?

我正在尝试将 Hasql.Pool 库(并且最终不会远离 hasql 生态系统太远)和仆人处理程序结合起来。

简而言之,如果我使用纯函数,我将不得不像这样传递我的连接池:

之后会有数百个,所以你明白了。

有人告诉我,在这种情况下,使用 Reader monad 是正确的选择,再加上 Servant 包本身的提升服务器功能。我对 monad 转换器并不完全放心,所以只是设法达到了这种代码(由于类型错误,这显然不起作用)

非常感谢提前