SQL вставить фрагмент интерфейса - PullRequest
1 голос
/ 11 апреля 2020

Я пишу функцию, которая добавляет одну строку в базу данных 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 {}, фрагмент интерфейса

Я не понимаю, что не так.

1 Ответ

2 голосов
/ 11 апреля 2020

Во втором фрагменте вы не сжимаете c над аргументами, вы просто передаете c. Поэтому в ManageDB, args равно:

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

И поэтому sqlx думает, что вы хотите, чтобы $1 был этим целым массивом.

Исправление будет вызывать ManageDB вроде так:

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