Hasql:'SET' 语句中的变量替换错误

Hasql: Error from variable substitution in 'SET' statement

我正在尝试使用 Hasql 编写参数化语句以在 PostgreSQL 中设置变量。

import qualified Hasql.Encoders as E
import qualified Hasql.Decoders as D

setOrganization :: Query Int64 ()
setOrganization = statement sql (E.value E.int8) D.unit False
  where
    sql = "set my_session.organization_id = "

以上结果为:

ResultError (ServerError "42601" "syntax error at or near \"\"" Nothing Nothing)

添加单引号,例如

    sql = "set my_session.organization_id = ''"

当我 运行 使用变量查询时给出此结果:

ResultError (ServerError "22P02" "invalid input syntax for integer: \"\"" Nothing Nothing)

这确实有意义,因为 organization_idbigint / int8

硬编码 </code> 两种格式的值都有效。我尝试过不同的 Hasql 类型,例如<code>E.textE.unknown 但这不起作用。


更新:使用 postgresql-libpq.

中更原始的 execParams 函数
execParams c "SET my_session.organization_id = ''" [Just (Oid 20, "1",Text)] Text

未加引号的变量给出 FatalError 结果。单引号变量给出 CommandOk,但对于以后的查询来说是错误的类型(不是 bigint)。

SET 命令不能与准备好的语句一起使用。这是 PostgreSQL 的限制。 准备好的语句 是带有可选参数的语句,可以使用不同的参数值执行多次。所有带参数的语句都是 PostgreSQL 中的准备语句,无论您只执行一次还是为它们命名以供重用。

您必须构造一个具有常量值的查询字符串并执行它。

或者,您可以在 PostgreSQL 中编写一个函数,使用动态 SQL 为您运行 set 命令,并在准备好的 SELECT 语句中使用参数调用该函数。