2016-10-26 131 views
9

我試圖使用golang將數據插入到mysql數據庫中。在我的值接受一個空字符串的情況下,我想插入一個null。我怎樣才能調整以下插入空值而不是空字符串?謝謝。Golang將NULL插入到SQL中而不是空字符串

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

回答

7

在我的代碼我有一個字符串轉換爲sql.NullString

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

然後,每當我使用Exec我總結我的琴絃,可能是空的DB與NewNullString功能的功能。

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

爲什麼不讓''NewNullString(..)'函數返回'interface {}',這樣如果's'不是一個空字符串,你可以返回它而不包含在'sql.NullString'中? – slomek

+0

@slomek如果一個名爲'NewNullString'的函數沒有返回一個名爲NullString的類型,我會發現它很混亂。 – jmaloney

+0

然後我會重命名這個函數,因爲除了實際的Null值之外,現在返回的東西似乎讓人困惑。不要誤解我的意思,畢竟這是正確的答案,我只是想知道;) – slomek

7

database/sql包具有用於只是此情況NullString類型(docs)。

基本上只使用sql.NullString來代替你希望它們在db中可以爲空的字符串。

您也可以在代碼中使用*string來達到同樣的效果。

無論是哪種情況,問題都是從可空字符串映射到非空字符串。空字符串是技術上的值,所以你總是不得不做這樣的事情,如果你決定空字符串應該被翻譯爲nil:

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

另一種方法是隻使用*string,而不是string你模型貫穿你的應用。

在數據庫中,我一直採用空字符串和null是等價的方法,只是將空sting存儲在數據庫中,並使大多數列不可爲空。

+0

有沒有辦法將字符串強制轉換爲NullString? – user2694306

+0

添加了一些文字。 – captncraig

相關問題