Golang将NULL插入sql而不是空字符串

时间:2016-10-26 15:44:08

标签: mysql go

我正在尝试使用golang将数据插入到mysql数据库中。在我的值采用空字符串的情况下,我想插入一个null。如何调整以下内容以插入空值而不是空字符串?感谢。

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

2 个答案:

答案 0 :(得分:25)

在我的代码中,我有一个将字符串转换为sql.NullString

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

然后,无论何时我使用Exec,我都会使用NewNullString函数在DB中包装可能为NULL的字符串。

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

答案 1 :(得分:9)

database/sql包有NullString类型(docs),仅适用于这种情况。

基本上只需使用sql.NullString代替您希望它们在db中可以为空的字符串。

您还可以在代码中使用*string来达到同样的效果。

在任何一种情况下的问题都是映射到可空字符串/从非可空字符串映射到非可空字符串。空字符串在技术上是一个值,所以如果你认为空字符串应该转换为nil,你几乎总是要做这样的事情:

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

另一种方法是在整个应用中使用*string而不是string

在数据库中,我一直采用空字符串和null等效的方法,只是将空sting存储在db中,并使大多数列不可为空。