首页 > 后端开发 > Golang > 如何处理 GORM 模型中的可为空字符串?

如何处理 GORM 模型中的可为空字符串?

Patricia Arquette
发布: 2024-11-06 01:28:02
原创
892 人浏览过

How to Handle Nullable Strings in GORM Models?

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

创建 GORM 模型时,如果尝试使用需要可为空的字段的字符串类型。当对可空字段使用 sql.NullString 时会出现此问题。

问题:

您收到的错误,“不能使用“字符串在此处”,( type string) as type sql.NullString in field value”,表示您尝试将字符串直接分配给 sql.NullString 字段。但是,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 value.

<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>
登录后复制

使用此类型,您可以按如下方式初始化 Something 字段:

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

以上是如何处理 GORM 模型中的可为空字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

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