Go database/sql チュートリアル 08 - NULLの扱い方

"Handling Errors" from database/sql tutorial

Go database/sqlチュートリアルのNULLの扱い方の日本語意訳になります。


NULLの扱い方

NULL許可のカラムは迷惑で、汚いコードにつながります。できれば使用を避けてください。
それができなければ、 database/sql パッケージの特別な型を使用するか、独自の型を定義する必要があります。

NUUL許可のブール値、文字列、整数、そして浮動小数点の型があります。
使用方法は次の通りです。

for rows.Next() {
	var s sql.NullString
	err := rows.Scan(&s)
	// errチェックをすること
	if s.Valid {
	   // s.String を使う
	} else {
	   // NULL値
	}
}

NULL許可の型の制限と、NULL許可のカラムを避ける理由は以下の通りです。

  • sql.NullUint64sql.NullYourFavoriteType はありません。これらの型の場合は自身で定義する必要があります。
  • NULL許可された値は難しく、将来性がありません。ある値がNULLになることはないと思っていても、それが間違っていた場合、プログラミングはクラッシュするし、リリース前にエラーを発見できることは滅多にありません。
  • Go言語の素晴らしい点として、全ての変数にデフォルトのゼロ値があることです。これはNULL許可な値が動作する方法と異なっています。

NULLを処理するために独自の型を定義する必要がある場合、 sql.NullString の設計をコピーして使うことができます。

データベースにNULL値を持つことが避けられない場合は、ほとんどのデータベースがサポートしている他の回避策を使います。つまり COALESCE() です。
無数の sql.Null* 型を使うことがなくても、以下のようなにすることができるかもしれません。

rows, err := db.Query(`
	SELECT
		name,
		COALESCE(other_field, '') as other_field
	WHERE id = ?
`, 42)

for rows.Next() {
	err := rows.Scan(&name, &otherField)
	// ..
	// もし `other_field` がNULLの場合、 `otherField` は空の文字列となります。
	// 他の型のデータでも同様に機能します。
}

前章: エラーハンドリング
次章: カラムが不明な場合

 
comments powered by Disqus