mysql - Golang 加入数组接口(interface)

标签 mysql go slice variadic go-gorm

我尝试创建批量插入。我使用 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
}

但是我得到一个错误:

Error 1136: Column count doesn't match value count at row 1 becuse i return wrong query

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')

问题是如何让数组接口(interface)生成像"XX1", "Jakarta", ...这样的字符串

感谢您的帮助。

最佳答案

如果你想将 slice 的元素传递给带有可变参数的函数,你必须使用 ... 告诉编译器你想单独传递所有元素而不传递 slice 值作为一个参数,所以简单地做:

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
}

关于mysql - Golang 加入数组接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128444/

相关文章:

mysql - 消除重复日期 MySQL

mysql - 如何设置 MySQL 以正确处理 unicode 变音符号?

go - 在不创建缓冲区的情况下写入标准输出

go - Golang 中的工厂函数

html - 如何为所有显示尺寸设计网站

javascript - 如何在 JS 中从数组中切出值

Mysql - 检查 VARCHAR 列是否在其增量上有缺失值

MySQL - 强制新记录字段值大于先前记录字段值的约束

go - 将uint32的字节附加到 byte slice 吗?

image - 使用 Go WebAssembly 访问 ImageData.data