$yanutetsu->{blog}

プログラマ三大美徳なPM

Spanner+Goでnullの扱いによるツラミ

やぬてつです。

この記事は Cloud Spanner をGo言語でゴニョゴニョしている人をターゲットにしています。

慣れないSQLと格闘している時、値が設定されていないカラムを引っ張ろうとしたところ、

spanner: code = "InvalidArgument", desc = "cannot decode field Hoge of Cloud Spanner STRUCT ... , destination *bool cannot support NULL SQL values"

こんな感じでエラーを吐かれた。

エラー吐いているところのソースを辿っていくと、

errDstNotForNull returns error for decoding a SQL NULL value into a destination which doesn't support NULL values.

このように書かれているので、当てている型がダメみたい。

Google先生に聞いてみたら database/sqlsql.NullBool 使ったら解決したよって見つけたので早速使ってみました。

, type *sql.NullBool cannot be used for decoding BOOL"

これでも解決しない...

あれ?何がダメなんだろう?いろんな記事にはこれ使えって書いてあったのに...

と、思っていたらついに見つけました!どうやらdatabase/sqlMySQL のもので Spanner では cloud.google.com/go/spanner を使わなければならないらしい。

google-cloud-go/value.go at master · GoogleCloudPlatform/google-cloud-go · GitHub

ということで spanner.NullBool を使うことで解決しました。

もしかして、GoでRDBとかしている人には常識なのかな?