7

一括挿入を作成しようとしています。gormを使用していますgithub.com/jinzhu/gorm

import (
    "fmt"
    dB "github.com/edwinlab/api/repositories"
)

func Update() error {
    tx := dB.GetWriteDB().Begin()
    sqlStr := "INSERT INTO city(code, name) VALUES (?, ?),(?, ?)"
    vals := []interface{}{}

    vals = append(vals, "XX1", "Jakarta")
    vals = append(vals, "XX2", "Bandung")

    tx.Exec(sqlStr, vals)

    tx.Commit()

    return nil
}

しかし、エラーが発生しました:

エラー 1136: 間違ったクエリを返すため、列数が行 1 の値数と一致しません

INSERT INTO city(code, name) VALUES ('XX1','Jakarta','XX2','Bandung', %!v(MISSING)),(%!v(MISSING), %!v(MISSING))

手動クエリを使用すると動作します:

tx.Exec(sqlStr, "XX1", "Jakarta", "XX2", "Bandung")

以下が生成されます。

INSERT INTO city(code, name) VALUES ('XX1', 'Jakarta'),('XX2', 'Bandung')

問題は、配列インターフェイスを作成して文字列を次のように生成する方法です"XX1", "Jakarta", ...

手伝ってくれてありがとう。

4

1 に答える 1

5

可変個引数を持つ関数にスライスの要素を渡したい場合は、...すべての要素を個別に渡し、スライス値を単一の引数として渡さないことをコンパイラに伝えるために使用する必要があるため、単純に次のようにします。

tx.Exec(sqlStr, vals...)

これは仕様で詳しく説明されています: Passing arguments to ... parameters

Tx.Exec()次の署名があります。

func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)

だからあなたは合格しなければなりませんvals...。また、返されたエラーを確認することも忘れないでください。

res, err := tx.Exec(sqlStr, vals...)
if err != nil {
    // handle error
}
于 2016-03-21T07:19:04.290 に答える