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



我有一个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
}

总是导致Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @foo_bar_invitation_id' at line 2

我通过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

我希望我只是不明白数据库是如何的。Exec args 插值/占位符有效,但我发现很难找到示例。

答案是将插值参数设置为 true。 https://github.com/go-sql-driver/mysql#interpolateparams

最新更新