-
-
データ調査を効率化!SQLとシェルを使って、データを自由に操作する方法
はじめまして。
4月からランサーズのエンジニアチームにジョインしました大平です。
好きな言語はPerl, ShellScript, JavaScriptです。
プロンプトはbashですが、個人的なShellScriptはzshです。
データ調査をしている時に、あと少しで欲しいデータが取れそうだけど、取れない。。。
そんなもどかしい経験ありませんか。そういった時どんな解決手段をとっていますか?
- 複雑なSQLを書いてがんばる
- サービスで使っているプログラミング言語を介して
- SQLとExcelの合わせ技でがんばる
- 手作業(気合い)でがんばる
色々なアプローチがあると思いますが、今回はそういった時に役立つかも知れないオススメな方法をご紹介したいと思います!
シェルからMySQLをナンパする方法
シェルスクリプトからMySQLにアクセスする
mysqlコマンドさえ使えれば標準的なUNIXコマンドを組み合わせるだけでも強力なツールとなります。
MySQLにログインせずにSQLを発行する方法といえば下記のいずれかですね。
今回はパスワード設定等をしていない体で書きますが、適宜、読み替えて頂ければと思います。
$ mysql -e ‘SELECT 1, 2, 3 FROM dual;’
$ mysql < /path/to/foo.sql
実行結果
+—+—+—+
| 1 | 2 | 3 |
+—+—+—+
| 1 | 2 | 3 |
+—+—+—+
前者はeオプションを用いてインラインでSQLを発行できるため変数を用いることが可能。
後者はプロダクトで使っているSQLファイルを流用することが可能。
以降はインライン版のみで記述していきます。
抽出したデータを整形する
しかし、mysqlコマンドで抽出しただけでは先頭2行がカラム名と罫線になっていたりして使いづらいですね。
そこでヘッダを出力しないようにNオプションを指定します。
$ mysql -N -e ‘SELECT 1, 2 from dual;’
実行結果
+—+—+
| 1 | 2 |
+—+—+
Nオプションを指定することでヘッダの出力を制限できました。
罫線が消えるといい感じにデータを扱いやすくなるのでsオプションを指定します
$ mysql -N -s -e ‘SELECT 1, 2 from dual;’
実行結果
1 2
実行結果を順次処理を行う
データがいい感じにとれたところで、これを処理していきます。
取得したデータをパイプでwhileに渡すだけです。
$ mysql -N -s -e ‘SELECT 1, 2 from dual;’ | while read line ; do echo “${line}” ; done
実行結果
1 2
dualから取得しているので、1件しかありませんが実際にはループしています。
ここまでくればカラム毎に処理をするだけですね。
データはtsvになっているので、そのまま配列に代入します。
$ mysql -N -s -e ‘SELECT 1, 2 from dual;’ | while read line ; do rs=($line) ; echo “${rs[0]} / ${rs[1]}” ; done
実行結果
1 / 2
レコード数、オートインクリメント値を変数に代入する
単にレコード数をとりたい場合などは実行結果をそのまま代入するだけです。
(dualのレコード数ってなんで1なんだろう。。)
foo_count=$(mysql -N -s -e ‘SELECT COUNT(*) FROM dual;’)
実行結果
1 / 2
実用にあたって
今回はDBから読み込んだデータを変数に代入するところまでとなります。
シェルからDBを利用することで短いコードで実現できて、色々と使い所はあるかと思います。
一方でSQLインジェクションに加え、コマンドインジェクションにも注意する必要が出てきますが、シェル自体は行ベースのデータとの相性が非常に良いのでRDBMSの処理には非常に適しています。
それでは快適なCLIライフをenjoy!!
ランサーズではサービスを成長させてくれるエンジニア、デザイナーを募集しています!
ご興味がある方は、以下URLよりご応募ください。
【中途採用】
フロントエンドエンジニア
サーバーサイドエンジニア
コーポレートエンジニア
SREエンジニア
【新卒採用・その他】
21・22新卒
その他採用情報
関連記事
-
-
ハーフマラソンをアジャイル開発っぽく走ってみて目標達成した話
こんにちは、エンジニアのshinです。 アジャイル開発を良いマラソンランナーに例えるなど、開発をマラソンに例えることはよくあります。 私自身も以前から、開発とマラソンには共通点があると感じており、 今回は、ランサーズで実施しているスクラム開発をハーフマラソンに …
-
-
Amazon Linux再起動時にUnicornを自動的に起動させる方法
ランサーズ Advent Calendar 2017の20日目を担当します、ota(@purratto)です。 今回はAmazon Linux再起動時にUnicornを自動的に起動させる方法を解説します。 実装方法 Unicornを自動的に起動させたいサーバ内 …
-
-
私はデジタルノマドです。世界中を旅しながらソフトエンジニアとして働いています。
日本語訳は後半に掲載しています :) I am digital nomad. I work as software engineer while traveling around the world. Yes, it is true! I work as so …