【问题标题】:SQL insert slice of interfaceSQL插入接口切片
【发布时间】:2020-04-11 16:43:22
【问题描述】:

我正在编写一个向 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 {},接口切片

我不明白出了什么问题。

【问题讨论】:

    标签: sql go sqlx


    【解决方案1】:

    在第二个 sn-p 中,您没有在参数上传播 c,您只是传递了 c。因此在ManageDB 中,args 等于:

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

    所以sqlx 认为你希望$1 成为整个数组。

    解决方法是像这样调用ManageDB

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2012-10-11
      • 2017-09-22
      • 2018-06-18
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多