базе (PostgreSQL) это поле JSONB и при селекте получаю ошибку:
sql: Scan error on column index 7, name "field_in_db": unsupported Scan, storing driver.Value type <nil> into type *InterfaceType
кто-нибудь сталкивался?
тут еще странно, что он звездочку перед именем интерфейса пишет...
все сталкивались возвращай из Value строку, а не массив байт. ну или в запрос правильную конверсию воткни
в Value делаю Marshal и потом возвращаю string(b) . про запрос и правильную конверсию - не понял. можешь раскрыть пожалуйста?
лень в старом коде рыться
Если поле jsonb+ pgx то func (s ProjectSettings) Value() (driver.Value, error) { return json.Marshal(s) } Если делать ресивер поинтер то вроде не работало
я же же вроде написал, что есть эти методы. ресивер и так и так пробовал.
ты выше ещё написал что через string(b) делаешь
попробуй еще раз прочесть
"в Value делаю Marshal и потом возвращаю string(b)"
так, а теперь свой ответ)
я вставил в БД сущность где это поле nil и теперь не могу селектнуть это. в поле null в базе.
А причем тут Marshall тогда, если при селекте Scan вызывается с анмаршалом?
именно. я поэтому. и написал)
решил, что лениться стыдно `values ($1, $2, $3::json)` вот $3 - как раз это Valuer
спасибо ツ пробую
проблема в том что, делаю INSERT, у поля стоит DEFAULT NULL. Далее делаю SELECT и получаю эту ошибку… то есть дело не в Value, а в Scan.
ну так ты сделай свой скан умнее 🙂 там все равно конверсия типа же из any перед unmarshal
да ошибка не внутри моего скана
и тут я понял, что дефолт для jsonb полей должен быть`{}`
то есть - придется тебе в запрос воткнуть возврат {} в случае, если там null
вставка работает как часы. а вот Scan не хочет вообше. изменил DEFAULT на ‘{}’::jsonb получил ошибку unsupported Scan, storing driver.Value type []uint8 into type *InterfaceTypeName в Scan даже дебаг не залетает (
раскурил. chatpgtv4 мощь, если правильно задать вопрос
и что ты раскурил?
Просто интерфейс вытащить из БД нельзя. Надо обернуть интерфейс в структуру. Для структуры реализовать методы Scan и Value. type Field interface {} type FieldValue struct {} func (f FieldValue) Value() {} func (f FieldValue) Scan() {} Вот щас эксперементирую, пока не проверил
У тебя как-то сложно, будто. // Value implements driver.Valuer interface. func (s ProjectSettings) Value() (driver.Value, error) { return json.Marshal(s) } // Scan implements sql.Scanner interface. func (s *ProjectSettings) Scan(src any) error { if src == nil { return nil } b, ok := src.([]byte) if !ok { return fmt.Errorf("invalid type: %T", src) } return json.Unmarshal(b, s) }
ProjectSettings у тебя это структура?
чет ты странное говоришь конечно, нельзя вытащить просто интерфейс, за ним должен быть конкретный инстанс конкретного типа
а у меня интерфейс
я с этого вопрос начал ツ
но это очевидно же! какой Scan ты рассчитывал, что позовется?
вообще в голове было что будет скан в интерфейс в пустой же интерфейс можно засканить? что-то типа того
в пустой можно, там на этот случай специальная обработка
ну вот в голове такая схема была
так а какая? четы ждал?
что и в непустой будет также работать ツ
так а как - так же?
как в пустой
Обсуждают сегодня