$2)
RETURNING (role_id, name, is_admin);
Code
// create Role
rows, err := db.QueryxContext(ctx, createRoleQuery, request.Name, request.IsAdmin)
if err != nil {return nil, err}
fmt.Printf("rows: %#+v\n", rows)
Output
rows: &sqlx.Rows{Rows:(*sql.Rows)(0xc0005f4480), unsafe:false, Mapper:(*reflectx.Mapper)(0xc0001171d0), started:false, fields:[][]int(nil), values:[]interface {}(nil)}
Почему sqlx не записывает в полученные Rows в values данные role_id, name, is_admin, хотя должен (по идее)?
Дальше по коду идёт считывание в структуру, но из-за нехватка данных "падает"
Вам нужно сделать (*Rows).Scan(&yourModel)
Code err = (*rows).Scan(&role) // если я правильно понял Err Scan called without calling Next Я ещё пробовал Code var role model.Role for rows.Next() { err := rows.StructScan(&role) if err != nil {return nil, err} } Но выдаёт: missing destination `name` row in *model.Role При том что сама структура имеет все нужные поля: type Role struct { ID int `db:"role_id" json:"id"` Name string `db:"name" json:"name"` IsAdmin bool `db:"is_admin" json:"is_admin"` } Как я понимаю, ошибка как раз в том что ничего не возвращается (и это по идее видно, т.к. rows.values пустой лист)
Вообще начнем с того, что нету большого смысла возвращать name и is_admin - эти поля аргументы запроса же. Достаточно вернуть role_id - я так понимаю, что это автоинкремент. А так тебе нужно вызвать QueryRowxContext. Или ExecContext и так из результата вытащить идентификатор - тут я не уверен, но вроде и то и то должно работать.
Про то что возвращать нет смысла это да, согласен. Про result.LastInsertId выбивает: LastInsertId is not supported by this driver (а у меня постгрес) В доке сказано, что он работает для MySQL, но для прочего использовать как раз RETURNING, что я и пытаюсь сделать Пробую сейчас с QueryRowxContext, тут что-то не понятное для меня Code row := db.QueryRowx(createRoleQuery, request.Name, request.IsAdmin) fmt.Printf("row: %#+v\n", row) var lid uint8 err := row.Scan(&lid) if err != nil {return nil, err} Out row: &sqlx.Row{err:error(nil), unsafe:false, rows:(*sql.Rows)(0xc000598800), Mapper:(*reflectx.Mapper)(0xc0001775c0)} "svc.role.Create: sql: Scan error on column index 0, name \"row\": converting driver.Value type []uint8 (\"(40,testd1234567891,t)\") to a uint8: invalid syntax" Т.е. видно что оно что-то вернуло но конвертировать не может Спасибо за помощь, уже вроде получше ошибка стала
Выглядит так, что запрос остался прежним
Только что заменил на RETURNING role_id; и помогло ) Не понимаю правда, почему row.Scan(&lid) при ретёрне нескольких значений выдавал ошибку Огромнейшее спасибо от всего сердца, а то всю ночь с этим мучался
Потому что количество переменных в которые сканишь должно быть таким же как количество переменных которое возвращаешь?
Очевидно же Вы вернули несколько значений, которые пытаетесь отсканить в одну переменную, вот и ошибка
Обсуждают сегодня