Есть ли что-то вроде sql .Null Json, похожее на sql .NullString в golang? - PullRequest
0 голосов
/ 04 февраля 2020

Я запрашиваю от postgres, используя golang, одно из полей содержит json, которое иногда может быть NULL

Как это

row := db.QueryRow(
    "select my_string, my_json from my_table where my_string = $1",
   my_id)


var my_string sql.NullString
var myjson MyJsonStruct
err := row.Scan(&my_string2, &myjson)

Но я получение

sql: Scan error on column index 2, name "my_json": unsupported Scan, storing driver.Value type <nil> into type *main.MyJsonStruct

Я проверил https://godoc.org/database/sql, но не нашел sql.NullJson Что такое go способ справиться с этой ситуацией?

1 Ответ

2 голосов
/ 04 февраля 2020

Нет, нет sql. json. Я думаю, что лучший способ справиться со столбцом json в БД - использовать оценщик и сканер. так как то так:

// Scan implements database/sql.Scanner interface
func (m *MyJsonStruct) Scan(src interface{}) error {
    if src == nil {
        return nil
    }
    data, ok := src.([]byte)
    if !ok {
        return errors.New("type assertion to []byte failed")
    }
    var myJsonStruct MyJsonStruct
    if err := json.Unmarshal(data, &myJsonStruct); err != nil {
        return fmt.Errorf("unmarshal myJsonStruct: %w", err)
    }
    *m = myJsonStruct
    return nil
}

// Value implements database/sql/driver.Valuer interface
func (m MyJsonStruct) Value() (driver.Value, error) {
    data, err := json.Marshal(m)
    if err != nil {
        return nil, fmt.Errorf("marshal myJsonStruct: %w", err)
    }
    return data, nil
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...