2017-10-26 11 views
1

リレーショナルデータベースでは、データベースからレコードを選択するときにフィールドが返されることがよくあります。 Goは文字列と数字をnilとして処理しません。この場合、補助型のsql.Null {type} がありますが、json形式でデータを返すと、javascriptにはこの型の使用が不要になりますヌル。sql.NullString || sql.NullInt64は通常の形式json nullに変換されますか?

今、私はsql.NullStringをマニュアルに変換します。また、nullではなく、空の行(行であれば) を返すSQL自体のバリアントがありますが、将来何らかの理由でデバッグするのが難しくなります。

この問題をどうやって解決しますか?

+1

私が正しく理解しているのであれば、「*文字列」または「* int」をスキャンするだけではいかがですか?これらの型は、 'encoding/json'によってマーシャリングできます。 –

+0

https://godoc.org/github.com/piotrkowalczuk/ntypesこのパッケージは、他のほとんどのインタフェースも実装している 'sql.NullString'のような型を提供します。 –

答えて

0

あなたの質問はちょっと混乱しますが、私はあなたが何を求めているのか理解していると思います。私が見つけられなくなった別の投稿に触発されて、JSONをプリミティブ型としてエンコードするためにsql.Null型のラッパーを記述しました。以下の例を参照してください:

import (
    "database/sql" 
    "encoding/json" 
) 

type JsonNullInt64 struct { 
    sql.NullInt64 
} 

type JsonNullFloat64 struct { 
    sql.NullFloat64 
} 

type JsonNullString struct { 
    sql.NullString 
} 

type JsonNullBool struct { 
    sql.NullBool 
} 

func (v *JsonNullBool) MarshalJSON() ([]byte, error) { 
    if v.Valid { 
     return json.Marshal(v.Bool) 
    } else { 
     return json.Marshal(nil) 
    } 
} 

func (v *JsonNullBool) UnmarshalJSON(data []byte) error { 
    var b *bool 
    if err := json.Unmarshal(data, &b); err != nil { 
     return err 
    } 

    if b != nil { 
     v.Valid = true 
     v.Bool = *b 
    } else { 
     v.Valid = false 
    } 

    return nil 
} 

func (v *JsonNullString) MarshalJSON() ([]byte, error) { 
    if v.Valid { 
     return json.Marshal(v.String) 
    } else { 
     return json.Marshal(nil) 
    } 
} 

func (v *JsonNullString) UnmarshalJSON(data []byte) error { 
    var str *string 
    if err := json.Unmarshal(data, &str); err != nil { 
     return err 
    } 

    if str != nil { 
     v.Valid = true 
     v.String = *str 
    } else { 
     v.Valid = false 
    } 

    return nil 
} 

func (v JsonNullFloat64) MarshalJSON() ([]byte, error) { 
    if v.Valid { 
     return json.Marshal(v.Float64) 
    } else { 
     return json.Marshal(0) 
    } 
} 

func (v *JsonNullFloat64) UnmarshalJSON(data []byte) error { 
    // Unmarshalling into a pointer will let us detect null 

    var x *float64 
    err := json.Unmarshal(data, &x) 
    if err != nil { 
     return err 
    } 
    if x != nil { 
     v.Valid = true 
     v.Float64 = *x 
    } else { 
     v.Valid = false 
    } 
    return nil 
} 

func (v JsonNullInt64) MarshalJSON() ([]byte, error) { 
    if v.Valid { 
     return json.Marshal(v.Int64) 
    } else { 
     return json.Marshal(0) 
    } 
} 

func (v JsonNullInt64) UnmarshalJSON(data []byte) error { 
    // Unmarshalling into a pointer will let us detect null 
    var x *int64 
    if err := json.Unmarshal(data, &x); err != nil { 
     return err 
    } 
    if x != nil { 
     v.Valid = true 
     v.Int64 = *x 
    } else { 
     v.Valid = false 
    } 
    return nil 
} 
+0

はい。申し訳ありませんが、私はまだ英語についてよく分かりませんが、すぐに学びます。 –

+0

ここで何を話していますか:https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267 –

+0

はい、そうです同様の実装 – tier1

関連する問題