NULLの使用¶
NULLのカラムは煩わしく、見通しの悪いコードにつながります。可能であれば避けてください。そうでない場合は、database/sql
パッケージの特定の型を用いて実装するか、独自の型を定義する必要があります。
ブール値、文字列、整数、および浮動小数点数にはNULLを許可する型があります。使用方法は次のとおりです。
for rows.Next() {
var s sql.NullString
err := rows.Scan(s)
// check err
if s.Valid {
// use s.String
} else {
// NULL value
}
}
Nullableな型の制限やNullableなカラムを避ける理由を示します。
sql.NullUint64
またはsql.NullYourFavoriteType
はありません。このために独自に定義する必要があります。Nullを許容する場合は注意が必要になる場合があり、将来に渡って使うことができません。何かの値が NULL でないと思いますが、間違っているとプログラムがクラッシュします。出荷する前に捕捉できないほど、たまにしか発生しないでしょう。
Goの良い点の1つは、すべての変数に便利なデフォルトのゼロ値を持つことです。これはnull値を許可するものの動作方法ではありません。
NULLを処理するために独自の型を定義する必要がある場合は、sql.NullString
の設計をコピーして実現できます。
データベースにNULL値が含まれることを避けられない場合は、ほとんどのデータベースシステムがサポートしている COALESCE()
の回避策があります。 次のようなものは、無数の sql.Null*
型を導入することなく使用できるものです。
rows, err := db.Query(`
SELECT
name,
COALESCE(other_field, '') as otherField
WHERE id = ?
`, 42)
for rows.Next() {
err := rows.Scan(&name, &otherField)
// ..
// If `other_field` was NULL, `otherField` is now an empty string. This works with other data types as well.
}
前に戻る: Handling Errors