
仕事でSQLを叩く時、データベースからの取得値をJSONにその場で変換できたら、
Javascriptとの親和性も高く、便利なのにな〜と思っていたら、MySQLには。"JSON_OBJECTAGG()"という便利関数があるじゃないですか。
大喜びで使って、本番でコケて、別の手段を試みた顛末をブログに残しておきます。
JSON関数
JSON_OBJECTAGG()関数は、次のように書く事ができます。
SELECT
JSON_OBJECTAGG(uid,name)
FROM user
これで、次のようにデータが取得できます。
{1:"hoge", 2:"fuga", 3:"foo", 4:"bar"}
シンプルな、key=valueとして使えますが、戻り値の配列データから部分的にこれを作るJavascriptの手間を考えたらなかなか便利な機能です。
トラブル発生!!
この処理を施したプログラムを、本番環境にデプロイしたら、なんと
エラー!!!
どうやら、JSON_OBJECTAGG()関数が使えないというようなエラー文言が表示されていました。
この機能、Mysql 8.0以降で使える機能ということで、本番のSQLのバージョンを調べてみました。
SELECT version();
> 8.0.4
ん?あれ?、許容バージョンなのにエラーって・・・
もしかして、AWSのRDSのMysqlは、何か事情が違うのか?
そんなことはどうでもよくて、本番で使えないのであれば、別方式を考えなければいけない。
下位バージョン対応
下記の記述で、なんとか、JSON_OBJECTAGG()と同等の結果を得る事ができるようになりました。
SELECT
CONCAT('{', GROUP_CONCAT(CONCAT('"', id, '": "', name, '"') SEPARATOR ','), '}')
FROM user
無理クリJSON形式に整形している書き方ですが、古いバージョンでも動くので、
困ったらコレということで、コピペしてお使いくだされ(未来のオレ)。
あとがき
今回の開発作業は、まだ未公開のWebサービスだったので、本番でのエラーでも、何も問題がなかったんですが、
Dockerで本番と同じ構成にしていたと思い込んでいたのが、少し問題点でしたね。
よくみたら、DBは、maria dbを使っていたので、できるだけ本番環境と同じにしておく必要があると感じました。
ていうか、レトロ記述をしっかりと書くということをベースにコーディングするというのも悪くないリスクヘッジになるという事も理解できました。
新しい機能を使いたい気持ちをグッと抑えて、確実で着実にコーディングするのが、プロのエンジニアなんでしょうね。
0 件のコメント:
コメントを投稿