如何使用sqlx将变量传递给 do 块?

我正在尝试通过 在sql中运行以下块脚本。由于块不接受参数,我试图事先准备它。dosqlxdo


func LinkSessionUser(sessionId string, userId string, result *bool) error  {

    db := database.GetDB()

    statement, err := db.Preparex(`

        do

        $$

        begin

        if (exists(select id from "session" where id = $1) and exists(select id from "user" where id = $2)) then

          return insert into "session_user" (session_id, user_id) values ($1, $2) on conflict do nothing;

        else

          raise exception "Either session(id=%) or user(id=%) doesn't exist" $1, $2;

        end if;

        end

        $$;

    `)

    if err != nil {

        return err

    }

    return statement.Get(result, sessionId, userId)

}

但是当我运行它时,我得到了以下错误:


sql: expected 0 arguments, got 2

如何解决此问题?我应该在sql中替换吗?Preparexprepare


MM们
浏览 90回答 1
1回答

森林海

“我应该使用备品来替换 sql 中的备战吗?”-- 是的,但是您遇到的问题与 或语言本身无关。PreparexGo命令的代码块是 ,此字符串文本不会在命令执行期间被解析,也没有理由被解析,这就是为什么生成的预准备语句将没有定义的参数。正如您正确指出的那样,不支持输入参数,但是尝试通过包装在准备好的语句中来绕过该限制将根本不会产生您希望的结果。DOstring literalPREPAREDODO如果需要有条件地执行参数化 SQL 语句,则应使用该命令并显式执行生成的函数。CREATE FUNCTION
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go