Golang: нельзя использовать sql .NamedArg в подготовленном операторе - PullRequest
1 голос
/ 05 августа 2020

У меня есть запрос, который использует NamedArgs из sql .DB, и я получаю сообщение об ошибке при сборке

cannot use args (type []sql.NamedArg) as type []interface {} in argument to stmt.Exec

Пример в библиотеке SQL показывает, что он используется:

Example usage:
    db.ExecContext(ctx, `
     delete from Invoice
     where
     TimeCreated < @end
     and TimeCreated >= @start;`,
     sql.Named("start", startTime),
     sql.Named("end", endTime),
    )

Единственная разница в том, что я сейчас использую подготовленный оператор stmt и вызываю для него метод Exec. Я создал фрагмент NamedArg со своими значениями, и он использует расширитель ....

res, err := stmt.Exec(args...)

Что именно не так, когда пример показывает вызов метода sql.Named() непосредственно в коде? Почему не работает расширенный срез?

1 Ответ

0 голосов
/ 05 августа 2020

Именно так работает передача аргументов в функцию c * в Go. Вы либо передаете отдельные значения, которые могут быть любого типа, либо передаете фрагмент, тип элемента которого точно соответствует типу параметра c * , и следуете за ним ....

Т.е. вы можете сделать:

res, err := stmt.Exec(
    sql.Named("start", startTime),
    sql.Named("end", endTime),
)

или вы можете:

args := []interface{}{
    sql.Named("start", startTime),
    sql.Named("end", endTime),
}
res, err := stmt.Exec(args...)
...