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

问题描述 投票:0回答:1

我正在创建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,我应该使用哪种类型?

go orm gorm
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.