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_id
是 bigint
/ int8
。
硬编码 </code> 两种格式的值都有效。我尝试过不同的 Hasql 类型,例如<code>E.text
和 E.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
语句中使用参数调用该函数。
我正在尝试使用 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_id
是 bigint
/ int8
。
硬编码 </code> 两种格式的值都有效。我尝试过不同的 Hasql 类型,例如<code>E.text
和 E.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
语句中使用参数调用该函数。