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

71 просмотр

все сталкивались возвращай из 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 Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта