2016-10-26 4 views
9

Ich versuche, Daten in eine Mysql-Datenbank mit Golang einzufügen. In dem Fall, in dem mein Wert eine leere Zeichenfolge annimmt, möchte ich eine Null einfügen. Wie kann ich Folgendes anpassen, um Nullen anstelle von leeren Strings einzufügen? Vielen Dank.Golang NULL in sql statt leere Zeichenfolge einfügen

_, 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) 

Antwort

7

In meinem Code habe ich eine Funktion, die eine Zeichenfolge sql.NullString

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

Dann wandelt, wenn ich Exec verwende ich meine Saiten wickeln, die in der DB mit der NewNullString Funktion NULL sein könnte.

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

Warum machst du deine 'NewNullString (..)' Funktion nicht 'interface {}', so dass, wenn 's' keine leere Zeichenkette ist, du sie zurückgeben könntest, ohne sie in' sql.NullString' einzufügen? – slomek

+0

@slomek Ich würde es verwirrend finden, wenn eine Funktion namens 'NewNullString' keinen Typ namens NullString zurückgibt. – jmaloney

+0

Ich würde diese Funktion dann umbenennen, da die Rückgabe von etw anders als ein tatsächlicher Nullwert jetzt verwirrend scheint. Versteh mich nicht falsch, das ist nach all der richtigen Antwort, ich frage mich nur;) – slomek

7

Das database/sql Paket hat einen NullString Typ (docs) für genau diese Situation.

Verwenden Sie im Grunde nur sql.NullString anstelle von Strings, wo Sie wollen, dass sie in db nullable sein können.

Sie könnten auch eine *string in Ihrem Code mit dem gleichen Effekt verwenden.

Das Problem in beiden Fällen ist die Zuordnung zu/von einer nullbaren Zeichenfolge zu einer nicht nullbaren Zeichenfolge. Die leere Zeichenkette ist technisch ein Wert, so dass Sie fast immer haben, etwas zu tun, wenn Sie leere Zeichenfolge entscheiden sollte auf Null übersetzt werden:

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

Die Alternative nur *string wäre zu verwenden, anstatt string in Ihrem Modelle in Ihrer App.

In Datenbanken habe ich den Ansatz angenommen, dass leere Zeichenfolge und null gleichwertig sind, und nur leeres Stachel in der Datenbank speichern, und die meisten Spalten nicht nullfähig machen.

+0

Gibt es eine Möglichkeit, eine Zeichenfolge in NullString zu konvertieren? – user2694306

+0

hat etwas Text hinzugefügt. – captncraig

Verwandte Themen