首页 > 后端开发 > Golang > 正文

为什么 Go 的 GORM 库会出现'Unable to use type string as sql.NullString”错误,如何解决?

Linda Hamilton
发布: 2024-11-06 15:43:02
原创
481 人浏览过

Why does the error

理解“Unable to use type string as sql.NullString”错误

在 Go 中,gorm.Model 提供了使用的功能使用 SQL 的数据库。使用 GORM 创建数据库模型时,必须适当声明数据类型以匹配其相应的 SQL 数据类型。尝试将字符串值分配给已声明为 sql.NullString 的字段时,会出现“无法使用字符串类型作为 sql.NullString”错误。

sql.NullString: A Struct, Not String

sql.NullString 类型本身不是字符串类型,而是结构体。它包含两个字段:String(实际字符串值)和 Valid(一个布尔值,指示字符串值是否有效或 NULL)。

正确初始化 sql.NullString

要正确初始化 sql.NullString 值,请提供一个 sql.NullString 结构,并适当设置 String 和 Valid 字段。例如:

<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 和驱动程序。估价器接口。通过利用空字节,您可以发出 NULL 值信号。

<code class="go">type MyString string

const MyStringNull MyString = "\x00"

// Implement driver.Valuer to convert to database value
func (s MyString) Value() (driver.Value, error) {
    if s == MyStringNull {
        return nil, nil
    }
    return []byte(s), nil
}

// Implement sql.Scanner to convert from database value
func (s *MyString) Scan(src interface{}) error {
    // Handle different types
    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",
    Something:   "a string goes here", // implicitly converted to MyString
    Holyday:      false,
})</code>
登录后复制

注意: 将类型化字符串值分配给自定义可为空字符串类型时,可能需要显式转换。

以上是为什么 Go 的 GORM 库会出现'Unable to use type string as sql.NullString”错误,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!