Postgresql Hasql:“SET”语句中的变量替换错误

Postgresql Hasql:“SET”语句中的变量替换错误,postgresql,haskell,hasql,Postgresql,Haskell,Hasql,我正试图用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.organ

我正试图用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 = $1"
上述结果是:

ResultError (ServerError "42601" "syntax error at or near \"$1\"" Nothing Nothing)
添加单引号,例如

    sql = "set my_session.organization_id = '$1'"
使用变量运行查询时给出此结果:

ResultError (ServerError "22P02" "invalid input syntax for integer: \"$1\"" Nothing Nothing)
这是有意义的,因为组织id是bigint/int8

将$1值硬编码为两种格式都有效。我尝试过不同的Hasql类型,例如e.text和e.unknown,但都不起作用

更新:使用postgresql libpq中更原始的execParams函数

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

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

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

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

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

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


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

错误消息表明$1占位符未被替换。我认为错误报告没有变量替换。使用$1占位符格式适用于select$1+4,因此该格式似乎没有问题。错误消息表明$1占位符未被替换。我认为错误报告没有变量替换。使用$1占位符格式适用于select$1+4,因此该格式似乎没有问题。因为我包含False,所以该查询用于参数化查询,而不是准备好的语句。此函数在libpq中。使用单引号运行SET查询将返回commandOk。@Mikkel我想Laurenz的意思是SET不能与参数语句一起使用。你需要把这个值硬编码到这个语句中。这个限制来自Postgres,而不是Hasql。因为我包含False,所以查询是用于参数化查询,而不是用于libpq中的准备语句。使用单引号运行SET查询将返回commandOk。@Mikkel我想Laurenz的意思是SET不能与参数语句一起使用。你需要把这个值硬编码到这个语句中。这种限制来自Postgres,而不是Hasql。
execParams c "SET my_session.organization_id = '$1'" [Just (Oid 20, "1",Text)] Text