无法将类型字符串用作 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,我应该为该字段使用什么类型?


红糖糍粑
浏览 375回答 1
1回答

www说

该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 stringconst MyStringNull MyString = "\x00"// implements driver.Valuer, will be invoked automatically when written to the dbfunc (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 dbfunc (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 stringvar ms MyStrings = "a string goes here"ms = s // won't compile because s is not an untyped constantms = MyString(s) // you have to explicitly convert
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go