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

Коллеги, вставил в структуру интерфейс с методами Value, Scan, в

базе (PostgreSQL) это поле JSONB и при селекте получаю ошибку:

sql: Scan error on column index 7, name "field_in_db": unsupported Scan, storing driver.Value type <nil> into type *InterfaceType

кто-нибудь сталкивался?

тут еще странно, что он звездочку перед именем интерфейса пишет...

38 ответов

67 просмотров

все сталкивались возвращай из Value строку, а не массив байт. ну или в запрос правильную конверсию воткни

Artur-Karapetov Автор вопроса
Daniel Podolsky
все сталкивались возвращай из Value строку, а не ...

в Value делаю Marshal и потом возвращаю string(b) . про запрос и правильную конверсию - не понял. можешь раскрыть пожалуйста?

Artur Karapetov
в Value делаю Marshal и потом возвращаю string(b) ...

Если поле jsonb+ pgx то func (s ProjectSettings) Value() (driver.Value, error) { return json.Marshal(s) } Если делать ресивер поинтер то вроде не работало

Artur-Karapetov Автор вопроса
Александр Костюченко
Если поле jsonb+ pgx то func (s ProjectSettings...

я же же вроде написал, что есть эти методы. ресивер и так и так пробовал.

Artur Karapetov
попробуй еще раз прочесть

"в Value делаю Marshal и потом возвращаю string(b)"

Artur-Karapetov Автор вопроса

я вставил в БД сущность где это поле nil и теперь не могу селектнуть это. в поле null в базе.

Artur Karapetov
я вставил в БД сущность где это поле nil и теперь ...

А причем тут Marshall тогда, если при селекте Scan вызывается с анмаршалом?

Artur Karapetov
в Value делаю Marshal и потом возвращаю string(b) ...

решил, что лениться стыдно `values ($1, $2, $3::json)` вот $3 - как раз это Valuer

Artur-Karapetov Автор вопроса
Daniel Podolsky
решил, что лениться стыдно `values ($1, $2, $3::j...

проблема в том что, делаю INSERT, у поля стоит DEFAULT NULL. Далее делаю SELECT и получаю эту ошибку… то есть дело не в Value, а в Scan.

Artur Karapetov
проблема в том что, делаю INSERT, у поля стоит DEF...

ну так ты сделай свой скан умнее 🙂 там все равно конверсия типа же из any перед unmarshal

Artur-Karapetov Автор вопроса
Artur Karapetov
проблема в том что, делаю INSERT, у поля стоит DEF...

и тут я понял, что дефолт для jsonb полей должен быть`{}`

то есть - придется тебе в запрос воткнуть возврат {} в случае, если там null

Artur-Karapetov Автор вопроса
Daniel Podolsky
то есть - придется тебе в запрос воткнуть возврат ...

вставка работает как часы. а вот Scan не хочет вообше. изменил DEFAULT на ‘{}’::jsonb получил ошибку unsupported Scan, storing driver.Value type []uint8 into type *InterfaceTypeName в Scan даже дебаг не залетает (

Artur-Karapetov Автор вопроса
Artur Karapetov
вставка работает как часы. а вот Scan не хочет во...

раскурил. chatpgtv4 мощь, если правильно задать вопрос

Artur-Karapetov Автор вопроса
Daniel Podolsky
и что ты раскурил?

Просто интерфейс вытащить из БД нельзя. Надо обернуть интерфейс в структуру. Для структуры реализовать методы Scan и Value. type Field interface {} type FieldValue struct {} func (f FieldValue) Value() {} func (f FieldValue) Scan() {} Вот щас эксперементирую, пока не проверил

Artur Karapetov
Просто интерфейс вытащить из БД нельзя. Надо обер...

У тебя как-то сложно, будто. // 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) }

Artur-Karapetov Автор вопроса
Artur Karapetov
Просто интерфейс вытащить из БД нельзя. Надо обер...

чет ты странное говоришь конечно, нельзя вытащить просто интерфейс, за ним должен быть конкретный инстанс конкретного типа

Artur-Karapetov Автор вопроса
Александр Костюченко
Да

а у меня интерфейс

Artur Karapetov
я с этого вопрос начал ツ

но это очевидно же! какой Scan ты рассчитывал, что позовется?

Artur-Karapetov Автор вопроса
Daniel Podolsky
но это очевидно же! какой Scan ты рассчитывал, что...

вообще в голове было что будет скан в интерфейс в пустой же интерфейс можно засканить? что-то типа того

Artur Karapetov
вообще в голове было что будет скан в интерфейс в...

в пустой можно, там на этот случай специальная обработка

Artur-Karapetov Автор вопроса
Artur-Karapetov Автор вопроса
Daniel Podolsky
так а какая? четы ждал?

что и в непустой будет также работать ツ

Artur-Karapetov Автор вопроса

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

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

Ребят в СИ можно реализовать ООП?
Николай
32
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Кстати, что за тип булеана, который в памяти как 00 для фолса и 01 для тру отображается? Однобайтовый
Serjone
8
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
Карта сайта