首页 > 后端开发 > Golang > 如何在 GORM 中初始化 sql.NullString 字段?

如何在 GORM 中初始化 sql.NullString 字段?

Susan Sarandon
发布: 2024-11-05 15:59:02
原创
910 人浏览过

How to Initialize a sql.NullString Field in GORM?

无法使用 String 类型作为 SQL.NullString

问题

使用 sql.NullString 类型的字段创建 GORM 模型时,尝试使用字符串值初始化字段会导致错误:

cannot use "a string goes here", (type string) as type sql.NullString in field value
登录后复制

解决方案

sql.NullString类型实际上不是字符串类型,而是封装了字符串和布尔值的结构体指示字符串是否有效(非 NULL)的标志。要初始化 sql.NullString 字段,必须使用结构体值初始化它,而不是字符串值。

以下代码演示了如何正确初始化 sql.NullString 字段:

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  Something:   sql.NullString{String: "a string goes here", Valid: true},
  Holyday:     false,
})</code>
登录后复制

替代

或者,可以定义自定义可为空字符串类型,该类型实现 sql.Scanner 和 driver.Valuer 接口并使用空字节来表示 NULL 值。使用此自定义类型,可以使用原始语法来初始化可为空的字符串字段。

自定义类型:

<code class="go">type MyString string

const MyStringNull MyString = "\x00"

// implements driver.Valuer, will be invoked automatically when written to the db
func (s MyString) Value() (driver.Value, error) {
  if s == MyStringNull {
    return nil, nil
  }
  return []byte(s), nil
}

// implements sql.Scanner, will be invoked automatically when read from the db
func (s *MyString) Scan(src interface{}) error {
  switch v := src.(type) {
  case string:
    *s = MyString(v)
  case []byte:
    *s = MyString(v)
  case nil:
    *s = MyStringNull
  }
  return nil
}</code>
登录后复制

用法:

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  // no need for explicit typing/conversion
  Something:   "a string goes here",
  Holyday:     false,
})</code>
登录后复制

以上是如何在 GORM 中初始化 sql.NullString 字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板