2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2024.07.23
DB【Tips】Goのゼロ値をDBにInsertした際の挙動【Go】
業務中にGoのゼロ値を含む構造体を用いてDBに挿入するとNULLを設定したいカラムにNULLが設定されない現象に遭遇したのでその解決法を残しておきます。
Goのゼロ値というのは簡単に言うと、定義した変数の初期値を設定せずに使用した際に自動的に初期値として設定される値のことです。以下は主要なデータ型のゼロ値です。
文字列型(string) | “” |
整数型(int系) | 0 |
浮動小数点型(float系) | 0.0 |
論理型(bool) | false |
ポインタ型(*Type) | nil |
GORMはGoでのデータベース操作を簡単にするORMライブラリです。Go触ってる人からするとお馴染みですね。
ですがこのGORMは構造体のフィールド値がゼロ値であっても、そのフィールドのデフォルト値として扱います。
そのため、ゼロ値のフィールドはデータベースにNULLとして保存されません。
例:
type User struct {
ID uint
Name string
Age int
}
user := User{Name: "Tanaka"}
db.Create(&user)
上記の例ではAgeフィールドのゼロ値は0になり、データベース上にはNULLではなく0として挿入されます。
これにより構造体のフィールドがゼロ値を持っている状態でGORMを介してデータを入れた際に、初期値としてNULLが設定されることを期待していたカラムにNULLではなくゼロ値が入ってしまう、という現象になるわけですね。
初期値としてNULLを入れたい場合はフィールドをポインタ型にすればOKです。
type User struct {
ID uint
Name string
Age *int
}
ポインタ型にすることでAgeフィールドの初期値がnilになり、DBにはNULLとして挿入されます。
DBの更新時にNULLでアップデートをしたり、更新対象がゼロ値だった場合に更新対象としてみなされなかったりします。今回は作成時も気を付けないといけないということで一つ学びになりました。
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索