$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)
 ShiroNoHaga
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          ShiroNoHaga
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  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
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          ShiroNoHaga
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Про то что возвращать нет смысла это да, согласен. Про 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
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          ShiroNoHaga
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Только что заменил на RETURNING role_id; и помогло ) Не понимаю правда, почему row.Scan(&lid) при ретёрне нескольких значений выдавал ошибку Огромнейшее спасибо от всего сердца, а то всю ночь с этим мучался
Потому что количество переменных в которые сканишь должно быть таким же как количество переменных которое возвращаешь?
Очевидно же Вы вернули несколько значений, которые пытаетесь отсканить в одну переменную, вот и ошибка
Обсуждают сегодня