SQL插入接口(interface) slice

标签 sql go sqlx

我正在编写一个向 SQLite 数据库添加一行的函数。

func ManageDB(db *sqlx.DB, query string, args ...interface{}) (int64, error) {

stmt, err := db.Prepare(query)
    if err != nil {
        return -1, err
    }
    defer stmt.Close()

    tx, err := db.Begin()
    if err != nil {
        return -1, err
    }
    _, err = tx.Stmt(stmt).Exec(args...)
    if err != nil {
        log.Errorf("error inserting row '%s' %v", query, err)
        log.Debugln("Doing rollback on Insert")
        tx.Rollback()
    } else {
        tx.Commit()
    }

  return res.LastInsertId()
}


我用那个来称呼它

b := "INSERT INTO MYTABLE (name1, name2, name3, name4) VALUES($1, $2, $3, $4)"

c := []interface{}{
      "string1",
      "string2",
      0,          // int64
      "string4", //string4 
    }

idt, err := models.ManageDB(
      db,  //db initialized 
      b,
      c,
    ) 

.......


当我测试该功能时,它可以正常工作,并且可以毫无问题地添加项目。

当我在主代码上运行它时,它会报告此错误:

sql: converting argument $1 type: unsupported type []interface {}, a slice of interface



我不明白出了什么问题。

最佳答案

在第二个片段中,您没有传播 c在参数上,您只是传递 c .因此在 ManageDB , args等于:

[]interface{}{
    []interface{}{
        "string1",
        "string2",
        0,
        "string4",
    }
}
等等sqlx认为你想要$1成为整个数组。
解决方法是调用 ManageDB像这样:
models.ManageDB(db, b, c...) 

关于SQL插入接口(interface) slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61160296/

相关文章:

php - 日期列是varchar如何从01-01-2019到今天选择数据

Go:嵌入类型在派生类型中的字段初始化

github - 如何使 godoc 链接到 github 上的源代码

go - 结构时间属性不从 Go sqlx 库加载

mysql - sql : Scan error on column index 6, 名称 "scheduled_date": null: cannot scan type []uint8 into null. 时间

sql - 尝试按日期过滤 SQL 结果

case 子句中的 SQL 相关子查询

mysql - 如何对 "group by"子句进行排序,以便返回的值是最后一个

node.js - 当依赖包所有者从 github 中删除存储库时,Golang 项目会发生什么?

go - sqlx - 具有 >1 列的非结构 dest 类型结构 (2)