Closed1
【Go】SELECT データがない場合はNULLでエラーになる回避

問題
以下のusers
テーブルを考える。
id | counpany_id | age |
---|---|---|
1 | 3 | 28 |
そして、年齢を最大値を取得するSQLクエリを考える。(GORMを利用)
sql
CID := 3
var maxAge int
if err := s.tx.Table("users").Where("company_id = ? AND is_delete = 0", CID).Select("MAX(age) AS max_age").Take(&maxAge).Error; err != nil {
// 予期せぬエラー
return err
}
レコードがある時は難なくいけるのだが、レコードが存在しない場合は予期せぬエラーになる。
error
sql: Scan error on column index 0, name "max_age": converting NULL to int is unsupported
原因
レコードはない場合、SQLではnullが帰ってきてintで定義されたmaxAge
に代入できないためである。
解決策
sql.NullInt16
を使うことで解決される。
script
CID := 3
var maxAge sql.NullInt16
if err := s.tx.Table("users").Where("company_id = ? AND is_delete = 0", CID).Select("MAX(age) AS max_age").Take(&maxAge).Error; err != nil {
// 予期せぬエラー
return err
}
fmt.Println(maxAge.Valid) // false
fmt.Println(maxAge.Int16) // 0
Validは、nullの場合はfalse
, not nullの場合はtrue
, Int16には、ゼロ値が入る。
詳しくは以下を見る
このスクラップは2023/06/02にクローズされました