web-dev-qa-db-fra.com

Golang Insérer NULL dans sql au lieu d'une chaîne vide

J'essaie d'insérer des données dans une base de données mysql en utilisant golang. Dans le cas où ma valeur prend une chaîne vide, je voudrais insérer un null. Comment puis-je ajuster ce qui suit pour insérer des valeurs nulles au lieu d'une chaîne vide? Merci.

_, err := m.Db.Exec(`INSERT INTO 
                         visitor_events
                         (type, 
                          info, 
                          url_path, 
                          visitor_id, 
                          created_at, 
                          domain)
                          VALUES
                          (?, ?, ?, ?, ?, ?)`,
                          m.SaveEventType(ve), ve.EventInfo, m.SaveURLPath(ve.UrlPath), ve.VisitorId, time.Now().UTC(), ve.Domain)
22
user2694306

Dans mon code, j'ai une fonction qui convertit une chaîne en sql.NullString

func NewNullString(s string) sql.NullString {
    if len(s) == 0 {
        return sql.NullString{}
    }
    return sql.NullString{
         String: s,
         Valid: true,
    }
}

Ensuite, chaque fois que j'utilise Exec j'encapsule mes chaînes qui pourraient être NULL dans la base de données avec la fonction NewNullString.

db.Exec(`
  insert into
      users first_name, last_name, email
      values (?,?,?)`,
  firstName,
  lastName,
  NewNullString(email),
)
32
jmaloney

Le database/sql le paquet a un type NullString ( docs ) juste pour cette situation.

Fondamentalement, utilisez simplement sql.NullString à la place des chaînes où vous souhaitez qu'elles puissent être annulées dans db.

Vous pouvez également utiliser un *string dans votre code au même effet.

Dans les deux cas, le problème est lié au mappage vers/depuis une chaîne nullable vers une chaîne non nullable. La chaîne vide est techniquement une valeur, donc vous devrez presque toujours faire quelque chose comme ceci si vous décidez que la chaîne vide doit être traduite en néant:

nullableS := &s
if s == "" {
  nullableS = nil
}

L'alternative serait d'utiliser simplement *string au lieu de string dans vos modèles dans votre application.

Dans les bases de données, j'ai adopté l'approche selon laquelle la chaîne vide et la valeur null sont équivalentes et je stocke simplement la piqûre vide dans la base de données et rend la plupart des colonnes non nullables.

11
captncraig