SQL 插入界面切片

SQL insert slice of interface

我正在编写一个向 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(, , , )"

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

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

.......

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

当我在主代码上运行它时,报这个错误:

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

我不明白哪里出了问题。

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

[]interface{}{
    []interface{}{
        "string1",
        "string2",
        0,
        "string4",
    }
}

因此 sqlx 认为您希望 </code> 成为整个数组。</p> <p>修复方法是像这样调用 <code>ManageDB

models.ManageDB(db, b, c...)