gpt4 book ai didi

go - DB.Exec args 总是导致我的占位符出错

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:57 27 4
gpt4 key购买 nike

我有一个 SQL 脚本,其中包含一个我想从 Golang 设置的变量。

SET @foo_bar_invitation_id = ?;
SELECT @foo_bar_invitation_id;

即我要设置?到“foobar”。我的代码:

package main

import (
"io/ioutil"
"log"

"database/sql"

_ "github.com/go-sql-driver/mysql"
)

type handler struct{ db *sql.DB }

func (h handler) runsql() (err error) {
sqlscript, err := ioutil.ReadFile("script.sql")
if err != nil {
return
}
_, err = h.db.Exec(string(sqlscript), "foobar")
if err != nil {
log.Println(err)
}
return
}

始终导致 错误 1064:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 2 行的“SELECT @foo_bar_invitation_id”附近使用的正确语法

我通过 gotests 生成的代码进行测试:

import (
"database/sql"
"os"
"testing"

_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func TestMain(m *testing.M) {
db, _ = sql.Open("mysql", os.Getenv("DSN"))
defer db.Close()
os.Exit(m.Run())
}

func Test_handler_runsql(t *testing.T) {
type fields struct {
db *sql.DB
}
tests := []struct {
name string
fields fields
wantErr bool
}{{
"Check ID can be set",
fields{db: db},
false,
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
h := handler{
db: tt.fields.db,
}
if err := h.runsql(); (err != nil) != tt.wantErr {
t.Errorf("handler.step2runsql() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

我的 DSN 连接字符串包括 ?multiStatements=true&sql_mode=TRADITIONAL

我希望我只是不明白如何DB.Exec args interpolation / placeholder有效,但我发现很难找到 examples .

最佳答案

答案是将 interpolate params 设置为 true。 https://github.com/go-sql-driver/mysql#interpolateparams

关于go - DB.Exec args 总是导致我的占位符出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206617/

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