go - 无法将类型字符串用作 sql.NullString
问题描述
我正在创建一个gorm
模型
// Day is a corresponding day entry
type Day struct {
gorm.Model
Dateday string `json:"dateday" gorm:"type:date;NOT NULL"`
Nameday string `json:"nameday" gorm:"type:varchar(100);NOT NULL"`
Something sql.NullString `json:"salad"`
Holyday bool `json:"holyday"`
}
我正在使用sql.NullString
该字段,Something
因为它可能为 NULL。
因此,当我尝试执行一个典型gorm
示例来验证我的设置是否有效时:
db.Create(&Day{
Nameday: "Monday",
Dateday: "23-10-2019",
Something: "a string goes here",
Holyday: false,
})
我得到:
不能在字段值中使用“一个字符串”,(类型字符串)作为类型 sql.NullString
Something
鉴于字段可能为 NULL,我应该为该字段使用什么类型?
解决方案
该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,
})
作为替代方案,如果您想在初始化可空字符串时继续使用更简单的语法,您可以声明自己的可空字符串类型,让它实现sql.Scanner
和driver.Valuer
接口,并利用空字节来表示NULL
值。
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 *String) Scan(src interface{}) error {
switch v := src.(type) {
case string:
*s = String(v)
case []byte:
*s = String(v)
case nil:
*s = StringNull
}
return nil
}
这样,如果您将字段声明Something
为类型MyString
,则可以按照最初的预期对其进行初始化。
db.Create(&Day{
Nameday: "Monday",
Dateday: "23-10-2019",
// here the string expression is an *untyped* string constant
// that will be implicitly converted to MyString because
// both `string` and `MyString` have the same *underlying* type.
Something: "a string goes here",
Holyday: false,
})
请记住,这仅适用于无类型常量,一旦你有一个类型的常量或变量string
,为了能够将它分配给MyString
你需要使用显式转换。
var s string
var ms MyString
s = "a string goes here"
ms = s // won't compile because s is not an untyped constant
ms = MyString(s) // you have to explicitly convert
推荐阅读
- python - pandas 第三列答案基于第 1 列和第 2 列
- git - 将存储库拆分为“子存储库”,同时保留远程到外部存储库
- ngrx - @ngrx/effects 再次调度操作
- javascript - 如何使用 JavaScript 将表单输入值传递给成功页面?
- file-io - 我在哪里以及如何创建另一个文件夹来放置文本文件,以便在我导出时它们可以工作?
- visual-studio-code - VS Code 中红色矩形内的文字是什么意思?
- nginx - Uvicorn 没有随机处理一些请求
- windows - 如何在系统启动时使用 c# 服务执行进程
- linux - 在 i3 中将触摸手势绑定到 gnome-terminal
- ios - 新的 React-Native 项目:构建失败 (ios)