Maison > développement back-end > Golang > Comment initialiser un champ sql.NullString dans GORM ?

Comment initialiser un champ sql.NullString dans GORM ?

Susan Sarandon
Libérer: 2024-11-05 15:59:02
original
909 Les gens l'ont consulté

How to Initialize a sql.NullString Field in GORM?

Impossible d'utiliser le type String comme SQL.NullString

Problème

Lors de la création d'un modèle GORM avec un champ de type sql.NullString, une tentative initialiser le champ avec une valeur de chaîne entraîne l'erreur :

cannot use "a string goes here", (type string) as type sql.NullString in field value
Copier après la connexion

Solution

Le type sql.NullString n'est pas réellement un type de chaîne mais une structure qui encapsule une chaîne et un booléen indicateur indiquant si la chaîne est valide (et non NULL). Pour initialiser un champ sql.NullString, il doit être initialisé avec une valeur de structure, pas une valeur de chaîne.

Le code suivant montre comment initialiser correctement un champ sql.NullString :

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  Something:   sql.NullString{String: "a string goes here", Valid: true},
  Holyday:     false,
})</code>
Copier après la connexion

Alternative

Alternativement, un type de chaîne nullable personnalisé peut être défini qui implémente les interfaces sql.Scanner et driver.Valuer et utilise un octet nul pour signaler une valeur NULL. Avec ce type personnalisé, la syntaxe d'origine peut être utilisée pour initialiser un champ de chaîne nullable.

Type personnalisé :

<code class="go">type MyString string

const MyStringNull MyString = "\x00"

// implements driver.Valuer, will be invoked automatically when written to the db
func (s MyString) Value() (driver.Value, error) {
  if s == MyStringNull {
    return nil, nil
  }
  return []byte(s), nil
}

// implements sql.Scanner, will be invoked automatically when read from the db
func (s *MyString) Scan(src interface{}) error {
  switch v := src.(type) {
  case string:
    *s = MyString(v)
  case []byte:
    *s = MyString(v)
  case nil:
    *s = MyStringNull
  }
  return nil
}</code>
Copier après la connexion

Utilisation :

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  // no need for explicit typing/conversion
  Something:   "a string goes here",
  Holyday:     false,
})</code>
Copier après la connexion

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