170 похожих чатов

Всем доброго утра, подскажите, пожалуйста SQL (работает) INSERT INTO role(name, is_admin) VALUES ($1,

$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, хотя должен (по идее)?
Дальше по коду идёт считывание в структуру, но из-за нехватка данных "падает"

9 ответов

10 просмотров

Вам нужно сделать (*Rows).Scan(&yourModel)

ShiroNoHaga- Автор вопроса
Alisher
Вам нужно сделать (*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 и так из результата вытащить идентификатор - тут я не уверен, но вроде и то и то должно работать.

ShiroNoHaga- Автор вопроса
Morozov Konstantin
Вообще начнем с того, что нету большого смысла воз...

Про то что возвращать нет смысла это да, согласен. Про 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" Т.е. видно что оно что-то вернуло но конвертировать не может Спасибо за помощь, уже вроде получше ошибка стала

ShiroNoHaga- Автор вопроса
Morozov Konstantin
Выглядит так, что запрос остался прежним

Только что заменил на RETURNING role_id; и помогло ) Не понимаю правда, почему row.Scan(&lid) при ретёрне нескольких значений выдавал ошибку Огромнейшее спасибо от всего сердца, а то всю ночь с этим мучался

ShiroNoHaga
Только что заменил на RETURNING role_id; и помогло...

Потому что количество переменных в которые сканишь должно быть таким же как количество переменных которое возвращаешь?

ShiroNoHaga
Только что заменил на RETURNING role_id; и помогло...

Очевидно же Вы вернули несколько значений, которые пытаетесь отсканить в одну переменную, вот и ошибка

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
17
или вы считаете муит дает знание?
супер_лох_3000 альфа версия
12
А кто такой мужчина в твоем понимании Азиз?
who?です 🐈
11
Ну значит тебе повезло, мы же про транк говорим оба?
Александр (Rouse_) Багель
11
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Карта сайта