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

use*_*306 23 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)
Run Code Online (Sandbox Code Playgroud)

jma*_*ney 36

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

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

然后每当我使用时,我使用ExecNewNullString函数包装在DB中可能为NULL的字符串.

db.Exec(`
  insert into
      users first_name, last_name, email
      values (?,?,?)`,
  firstName,
  lastName,
  NewNullString(email),
)
Run Code Online (Sandbox Code Playgroud)

  • @slomek如果名为`NewNullString`的函数没有返回名为NullString的类型,我会感到困惑。 (3认同)

cap*_*aig 12

database/sql包具有适用于这种情况的NullString类型(docs).

基本上只是用来sql.NullString代替你希望它们在db中可以为空的字符串.

您也可以*string在代码中使用a 来获得相同的效果.

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

nullableS := &s
if s == "" {
  nullableS = nil
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是在整个应用程序中使用*string而不是string在模型中使用.

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


Man*_*seh 5

NULLIF您还可以在 SQL 查询中使用函数。

NULLIF(?, ''): 当您尝试插入空字符串时,将返回 NULL 而不是空字符串。

了解有关 NULLIF 的更多信息:链接