Maison > développement back-end > Golang > Comment gérer efficacement les valeurs SQL NULL et leur représentation JSON dans Go ?

Comment gérer efficacement les valeurs SQL NULL et leur représentation JSON dans Go ?

Mary-Kate Olsen
Libérer: 2025-01-03 06:22:39
original
254 Les gens l'ont consulté

How to Efficiently Handle SQL NULL Values and Their JSON Representation in Go?

Travailler avec les valeurs SQL NULL et JSON de manière efficace

Dans cet article, nous abordons le dilemme de l'utilisation des valeurs SQL NULL dans Go et comment gérer leur Représentation JSON efficace.

Lors de l'utilisation de types Go tels que int64 et string, les valeurs nulles ne peuvent pas être directement stockées. Cependant, nous pouvons utiliser sql.NullInt64 et sql.NullString à cet effet. Cependant, lorsque ces types sont intégrés dans une structure et convertis en JSON à l'aide du package json, le format résultant s'écarte de celui obtenu lors de l'utilisation des types int64 et string normaux.

Cette disparité se produit parce que la représentation JSON de Les types sql.Null*** incluent un niveau supplémentaire car ces types sont essentiellement eux-mêmes des structures. En conséquence, il est nécessaire de trouver une solution de contournement pour obtenir le format JSON souhaité.

Au lieu d'abandonner l'utilisation de valeurs NULL dans la base de données SQL, une solution viable consiste à créer un type personnalisé qui implémente le json. Interfaces Marshaller et json.Unmarshaler. En embarquant le type sql.NullInt64, nous conservons les méthodes SQL tout en prenant le contrôle de la gestion JSON. Voici un exemple illustrant cette approche :

type JsonNullInt64 struct {
    sql.NullInt64
}

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

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
}
Copier après la connexion

En utilisant ce type personnalisé à la place de sql.NullInt64, la représentation JSON s'aligne sur le format souhaité.

Pour démontrer cette solution, vous pouvez exécutez le code suivant dans un terrain de jeu Go :

func main() {
    type Person struct {
        Age     int64                `json:"age"`
        AgeJson JsonNullInt64        `json:"ageJson"`
    }
    p := Person{
        Age:     10,
        AgeJson: sql.NullInt64{Int64: 0, Valid: true},
    }
    b, _ := json.Marshal(p)
    fmt.Println(string(b))
}
Copier après la connexion

Le résultat ressemblera au suivant :

{"age":10,"ageJson":10}
Copier après la connexion

Cette approche permet une gestion transparente des valeurs NULL dans SQL et JSON, tout en maintenant la cohérence dans la représentation des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal