MySQLのレスポンス結果をJSON形式で返してjqコマンドに渡す

MySQLのレスポンス結果をJSON形式で返してjqコマンドに渡す

Twitter LINEで送る Facebook はてなブログ

MySQLのレスポンス結果をJSON形式で取得したいと考えいろいろ調べた結果をまとめていきます。

mysqlshコマンドを利用することでレスポンス結果をJSON形式で返却することができます。

mysqlshコマンドのインストール

以下のサイトからmysqlshコマンドのインストール方法があるので参照してください。 https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-install.html

MySQLをDockerでインストールし初期データの準備

docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql:latest
mysql -h 127.0.0.1  -u root -ppassword

Databaaseの作成とサンプルデータを作成

CREATE DATABASE test;
USE test;
CREATE TABLE data(
    id SERIAL PRIMARY KEY,
    title VARCHAR(256)
);
INSERT INTO data(title) VALUES('A1'), ('B2'), ('C3'), ('D4');

パスワードファイルの作成

vi ~/my.conf
=== 以下を貼り付け ===
[client]
user = root
password = password
====================

mysqlshコマンドを利用してJSONの結果を返却

mysqlshは、直接SQLを操作というよりコマンドライン上でSQLを指定して実行した結果を返す形なので mysql -eオプションを使うイメージが同じ感じになります。

mysqlshコマンドの基本サンプル

dataテーブルをSELECTするだけのサンプルです。

mysqlsh --defaults-extra-file=~/my.conf --host=127.0.0.1 --port=3306 --sql --execute='SELECT * FROM test.data;'
=== 実行結果 ===
id	title
1	A1
2	B2
3	C3
4	D4
===============

mysqlshコマンドでjson形式のレスポンス結果を得る

dataテーブルをSELECTした結果をjson形式で返却します。 先ほどのコマンドに –result-format=jsonをつけるだけでできます。

mysqlsh --defaults-extra-file=~/my.conf --host=127.0.0.1 --port=3306 --result-format=json --sql --execute='SELECT * FROM test.data;'
=== 実行結果 ===
{
    "id": 1,
    "title": "A1"
}
{
    "id": 2,
    "title": "B2"
}
{
    "id": 3,
    "title": "C3"
}
{
    "id": 4,
    "title": "D4"
}
==============


### mysqlshコマンドでjson形式のレスポンス結果をjqコマンドを繋ぐ

出力結果からjqコマンドを使ってさらにtitleのみを一覧化するようなサンプルとなります。
パイプラインを繋いでスクリプトを組み合わせれば色々な応用が効くと思います。
```sh
mysqlsh --defaults-extra-file=~/my.conf --host=127.0.0.1 --port=3306 --result-format=json --sql --execute='SELECT * FROM test.data;'  | jq '.title'
=== 実行結果 ===
"A1"
"B2"
"C3"
"D4"
==============

mysqlshコマンドでファイルから実行

ファイルからの実行にも対応しているので利用の幅としては申し分ないです。

echo "SELECT * FROM test.data" > test.sql
mysqlsh --defaults-extra-file=~/my.conf --host=127.0.0.1 --port=3306 --result-format=json --sql --file=test.sql
=== 実行結果 ===
{
    "id": 1,
    "title": "A1"
}
{
    "id": 2,
    "title": "B2"
}
{
    "id": 3,
    "title": "C3"
}
{
    "id": 4,
    "title": "D4"
}
==============

まとめ

他のオプションは以下のサイトを参照
A MySQL Shell コマンドリファレンス

  • jsonレスポンを利用してjqコマンドとの応用が行える