gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:37:44 24 4
gpt4 key购买 nike

我正在尝试使用 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)

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

以任一格式硬编码 $1 值都有效。我尝试过不同的 Hasql 类型,例如E.textE.unknown 是行不通的。


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

execParams c "SET my_session.organization_id = '$1'" [Just (Oid 20, "1",Text)] Text

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

最佳答案

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

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

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

关于postgresql - Hasql: 'SET' 语句中的变量替换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940819/

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