ホームページ  >  記事  >  バックエンド開発  >  GORM で sql.NullString フィールドを初期化する方法は?

GORM で sql.NullString フィールドを初期化する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 15:59:02870ブラウズ

How to Initialize a sql.NullString Field in GORM?

文字列型を SQL.NullString として使用できない

問題

sql.NullString 型のフィールドを持つ GORM モデルを作成するときに、フィールドを文字列値で初期化すると、エラーが発生します:

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

解決策

sql.NullString 型は、実際には文字列型ではなく、文字列とブール値をカプセル化する構造体です。文字列が有効かどうか (NULL ではないか) を示すフラグ。 sql.NullString フィールドを初期化するには、文字列値ではなく、構造体値を使用して初期化する必要があります。

次のコードは、sql.NullString フィールドを正しく初期化する方法を示しています。

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  Something:   sql.NullString{String: "a string goes here", Valid: true},
  Holyday:     false,
})</code>

代替

あるいは、sql.Scanner インターフェイスと driver.Valuer インターフェイスを実装し、NULL バイトを使用して NULL 値を通知するカスタムの null 許容文字列型を定義することもできます。このカスタム タイプでは、元の構文を使用して null 許容文字列フィールドを初期化できます。

カスタム タイプ:

<code class="go">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 *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
}</code>

使用法:

<code class="go">db.Create(&Day{
  Nameday:     "Monday",
  Dateday:     "23-10-2019",
  // no need for explicit typing/conversion
  Something:   "a string goes here",
  Holyday:     false,
})</code>

以上がGORM で sql.NullString フィールドを初期化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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