首页  >  文章  >  后端开发  >  如何使用 GORM 和 sql.NullString 处理可为 Null 的字符串字段?

如何使用 GORM 和 sql.NullString 处理可为 Null 的字符串字段?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-06 03:29:02629浏览

How to Handle Nullable String Fields with GORM and sql.NullString?

无法使用类型字符串作为 sql.NullString

查询

在 GORM 中,对可能为 NULL 的字段使用 sql.NullString 会面临错误:

cannot use "a string goes here", (type string) as type sql.NullString in field value

尝试执行简单的 GORM 验证示例时。

解决方案

sql.NullString 不是字符串类型,而是定义为的结构类型:

type NullString struct {
    String string
    Valid  bool // Valid is true if String is not NULL
}

要正确初始化,请使用以下语法:

db.Create(&Day{
    Nameday:     "Monday",
    Dateday:     "23-10-2019",
    Something:   sql.NullString{String: "a string goes here", Valid: true},
    Holyday:     false,
})

替代解决方案

或者,保留更简单的初始化语法:

  1. 定义自定义可为空字符串类型:

    type MyString string
  2. 实现 sql.Scanner 和 driver.Valuer 接口来处理值转换。
  3. 覆盖Value() 和 Scan() 方法如下:

    func (s MyString) Value() (driver.Value, error) {
        if s == MyStringNull {
            return nil, nil
        }
        return []byte(s), nil
    }
    
    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
    }
  4. 将 Something 字段声明为 MyString 并按预期初始化它:

    db.Create(&Day{
        Nameday:     "Monday",
        Dateday:     "23-10-2019",
        // Here, an untyped string constant will explicitly convert to MyString because they have the same underlying type.
        Something:   "a string goes here",
        Holyday:     false,
    })

以上是如何使用 GORM 和 sql.NullString 处理可为 Null 的字符串字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn