ホームページ >バックエンド開発 >Golang >GORM と sql.NullString を使用して Null 許容文字列フィールドを処理する方法

GORM と sql.NullString を使用して Null 許容文字列フィールドを処理する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 03:29:02706ブラウズ

How to Handle Nullable String Fields with GORM and sql.NullString?

タイプ文字列を sql.NullString として使用できません

Query

GORM では、NULL の可能性があるフィールドに sql.NullString を使用すると、エラー:

cannot use "a string goes here", (type string) as type sql.NullString in field value

簡単な GORM 検証例を実行しようとしています。

解決策

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,
})

代替解決策

または、より単純な初期化構文を使用する場合:

  1. カスタムの null 許容文字列型を定義します。

    type MyString string
  2. 値の変換を処理するために sql.Scanner インターフェイスと driver.Valuer インターフェイスを実装します。
  3. Overrideメソッド Value() および Scan() は次のようになります。

    func (s MyString) Value() (driver.Value, error) {
        if s == MyStringNull {
            return nil, nil
        }
        return []byte(s), nil
    }
    
    func (s *MyString) Scan(src interface{}) error {
        switch v := src.(type) {
        case string:
            *s = MyString(v)
        case []byte:
            *s = MyString(v)
        case nil:
            *s = MyStringNull
        }
        return nil
    }
  4. Something フィールドを MyString として宣言し、意図したとおりに初期化します。

    db.Create(&Day{
        Nameday:     "Monday",
        Dateday:     "23-10-2019",
        // Here, an untyped string constant will explicitly convert to MyString because they have the same underlying type.
        Something:   "a string goes here",
        Holyday:     false,
    })

以上がGORM と sql.NullString を使用して Null 許容文字列フィールドを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。