2016-10-26 14 views
9

Próbuję wstawić dane do bazy danych mysql za pomocą golang. W przypadku, gdy moja wartość przyjmuje pusty ciąg, chciałbym wstawić wartość zerową. Jak mogę dostosować następujące elementy, aby wstawić wartości null zamiast pustego ciągu? Dzięki.Golang Wstaw NULL do sql zamiast pustego łańcucha

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

Odpowiedz

7

W moim kodu mam funkcję, która konwertuje ciąg znaków na sql.NullString

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

Wtedy gdy używam Exec ja owinąć moje struny, które mogłyby być null w PB z funkcją NewNullString.

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

Dlaczego nie zwrócisz funkcji 'NewNullString (..)' return 'interface {}', więc jeśli 's' nie jest pustym łańcuchem, możesz zwrócić go bez zawijania do' sql.NullString'? – slomek

+0

@slomek Stwierdziłbym, że jest to mylące, jeśli funkcja o nazwie 'NewNullString' nie zwróciła typu o nazwie NullString. – jmaloney

+0

Zmieniłbym nazwę tej funkcji, ponieważ zwracanie czegoś innego niż rzeczywista wartość Null wydaje się teraz mylące. Nie zrozumcie mnie źle, to jest po wszystkim poprawna odpowiedź, po prostu się zastanawiam;) – slomek

7

Pakiet database/sql ma NullString typ (docs) dla właśnie tej sytuacji.

Zasadniczo po prostu użyj sql.NullString zamiast ciągów, w których chcesz je zerować w db.

Można również użyć kodu *string w tym samym efekcie.

Problem w obu przypadkach polega na odwzorowywaniu do/z ciągu zerowalnego na łańcuch nie-nullable. Pusty ciąg jest technicznie wartość, więc prawie zawsze trzeba zrobić coś takiego, jeśli zdecydujesz pusty ciąg powinny być przetłumaczone do zera:

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

Alternatywą byłoby po prostu wykorzystać *string zamiast string w swojej modele w całej aplikacji.

W bazach danych stosowałem podejście, że pusty ciąg znaków i wartość null są równoważne, i po prostu przechowywanie pustych żądań w db, i uczynienie większości kolumn nie-nullable.

+0

Czy istnieje sposób na przesłanie łańcucha do NullString? – user2694306

+0

dodano trochę tekstu. – captncraig