我正在创建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
类型实际上不是字符串类型,而是结构类型。定义为:
sql.NullString
因此您需要像这样初始化它:
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
作为替代,如果want在初始化可为空的字符串时继续使用更简单的语法,则可以声明自己的可为空的字符串类型,使其实现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