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 ответов

27 просмотров

Вам нужно сделать (*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; и помогло...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта