我正在尝试使用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)
答案 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中,并使大多数列不可为空。