首页 > 解决方案 > SQL插入接口切片

问题描述

我正在编写一个向 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: 转换参数 $1 类型: 不支持的类型 []interface {}, 接口切片

我不明白出了什么问题。

标签: sqlgosqlx

解决方案


在第二个片段中,您没有散布c参数,您只是在传递c. 因此,在 中ManageDBargs等于:

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

所以sqlx认为你想$1成为整个阵列。

修复将是这样调用ManageDB

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

推荐阅读