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.NullUint64
やsql.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