2016-10-26 15 views
9

Veriyi golang kullanarak mysql veritabanına eklemek istiyorum. Değerin boş bir dizeye girmesi durumunda, bir boş değer eklemek istiyorum. Boş dize yerine boş değer eklemek için aşağıdakileri nasıl değiştirebilirim? Teşekkürler.Golang Boş dize yerine SQL içine NULL ekle

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

cevap

7

ben NewNullString fonksiyonu ile DB NULL olabilir benim dizeleri sarın Exec kullanıyorum Sonra her sql.NullString

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

bir dize dönüştüren bir işlevi vardır.

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

Niçin 'newNullString (..)' fonksiyonunun '' geri dönüşü '' ara yüzünü {} 'yapmıyorsanız,' s' boş bir dize değilse 'sql.NullString''e sarmadan onu geri gönderebilirsiniz? – slomek

+0

@slomek "NewNullString" adlı bir işlev NullString adlı bir tür döndürmediyse, kafa karıştırıcı bulabilirim. – jmaloney

+0

Bu işlevi yeniden adlandırırdım, sonra gerçek bir Boş değer dışındaki geri sth artık kafa karıştırıcı gibi görünüyor. Beni yanlış anlama, bu doğru cevaptan sonra, sadece merak ediyorum;) – slomek

7

database/sql paket sadece bu durum için bir NullString türü (docs) sahiptir.

Temel olarak, db olarak null olması istediğiniz dizeleri yerine yalnızca sql.NullString kullanın.

Kodunuzda aynı etkiyle *string kullanabilirsiniz.

Her iki durumda da sorun, null olmayan bir dizgiye null olmayan bir dizgeye eşleştiriliyor. Eğer boş bir dize nil tercüme edilmelidir karar verirseniz hemen her zaman böyle bir şey yapmak zorunda kalacaktır öylesine boş dize, teknik olarak bir değerdir:

nullableS := &s 
if s == "" { 
    nullableS = nil 
} 
alternatif olacağını

sadece yerine string arasında *string kullanmak sizin uygulamanız boyunca modeller.

Veritabanlarında, boş dizgenin ve null'ın eşdeğer olduğunu ve boş sokmayı db'ye depolamayı ve çoğu sütunu null yapamaz hale getirme yaklaşımını alıyorum. Benim kod

+0

NullString'e bir dize dökmenin bir yolu var mı? – user2694306

+0

bir metin ekledi. – captncraig

İlgili konular