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/sql
の sql.NullBool
使ったら解決したよって見つけたので早速使ってみました。
, type *sql.NullBool cannot be used for decoding BOOL"
これでも解決しない...
あれ?何がダメなんだろう?いろんな記事にはこれ使えって書いてあったのに...
と、思っていたらついに見つけました!どうやらdatabase/sql
は MySQL のもので Spanner では cloud.google.com/go/spanner
を使わなければならないらしい。
google-cloud-go/value.go at master · GoogleCloudPlatform/google-cloud-go · GitHub
ということで spanner.NullBool
を使うことで解決しました。
もしかして、GoでRDBとかしている人には常識なのかな?