新しいアプリケーションの機能を実装する際に、ローカルや開発者向けのデータベースにアクセスして、プログラムを実装する前に何度かSQLをためしに実行することもあるかと思います。その際に、補完機能や以前実行したSQLの検索機能等がある場合とない場合では、作業の効率が変わってきます。
そこで、今回は補完や検索機能など、多くの便利な機能をもつmycliというクライアントについて紹介をしていきます。
デモンストレーション環境
今回は5.7.12を第5回 Dockerで複数バージョンのMySQLを開発環境に用意する で作成した環境で実行して確認していきます。また、今回使用するデータは「第2回 MySQLにはじめてのデータを入れてみる」 で紹介をしている郵便番号のテーブルを用いて紹介を行います。
mycliのインストール
ここではMySQLのクライアントの1つであるmycli を紹介します。mycliは自動補完とSQL構文のハイライトの機能等が強化されているMySQL用クライアントです。ライセンスは修正BSDライセンスとなっており、オープンソースソフトウェアとして開発が進められています。
次項からはインストール方法の説明と補完機能に関して説明を行います。Windowsに関しては公式的にサポートされていないので、今回は説明から外しています。
Mac OS X
Mac OS Xを開発環境として利用している場合は、Mac用のパッケージマネージャーであるHomebrew を使ってmycliインストールする方法が簡単です。Homebrewのインストールに関してはここでは割愛させていただきます。Homebrewを導入後、以下のコマンドを実行することでmycliをインストールできます。
% brew install mycli
以下のコマンドを入力してバージョンが表示されたら、導入は問題なく完了しています。
% mycli --version/Users/usr0200394/Documents/michibushin/road_of_mysql/20/MySQLコマンドラインツールで補完をする.md
Version: 1.6.0
Linux(CentOS)
続いてCentOSでのインストール方法です。Pythonのパッケージ管理マネージャーであるpipを利用してインストールします。インストールコマンドは以下のとおりです。筆者はCentOS 7上で動作を確認しました。まずはpipのインストールを行いましょう。
$ sudo easy_install pip
pipのインストールが無事終わったら、続けて必要なソフトウェアのインストールを行います。
$ yum install gcc python-devel -y
最後にpipコマンドを利用してmycliのインストールを行います。
$ sudo pip install mycli
途中で以下のようなエラーが発生してインストールが失敗した場合は、手順の途中にあるyumコマンドを実行して、mycliのインストールに必要なソフトウェアをインストールしてからpipコマンドを再実行してください。
File "/tmp/pip-build-o_O0TT/pycrypto/setup.py", line 278, in run
raise RuntimeError("autoconf error")
RuntimeError: autoconf error
Linux(Debian)
続いてDebianでのインストール方法です。Debianの有名なパッケージマネージャーであるapt-getを利用してインストールができます。筆者はDebian 8.1上で動作を確認しました。
MacやCentOSに比べると多少複雑ではありますが、mycli公式サイトのinstallページ に書いてある通りに進めればインストールができます。また、apt-transport-httpsとcurlがインストールされていない場合は、以下のapt-getコマンドを入力して、事前にcurlとapt-transport-httpsをインストールしておきましょう。
$ sudo apt-get install curl apt-transport-https -y
ではインストールを始めましょう。パッケージの認証のためのgpgキーを追加します。rootユーザになって実行してください。
$ sudo su -
$ curl https://packagecloud.io/gpg.key | sudo apt-key add -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3889 100 3889 0 0 20730 0 --:--:-- --:--:-- --:--:-- 20796
OK
OKと表示がされたら次へ進みましょう。mycliのパッケージを配布しているレポジトリをaptのソースに追加します。追加が終わったら続けてapt-get install
します。
$ echo "deb https://packagecloud.io/amjith/mycli/ubuntu/ trusty main" | sudo tee -a /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install mycli
以上でインストールが完了しました。インストールするのに多少苦労するかもしれませんが、今後のバージョンアップはsudo apt-get upgrade mycli
で行えるようになります。
mycliの使い方
まずは、MySQLのデータベースに接続してみましょう。接続はmysqlクライアントで接続するように、userとpasswordを付けて以下のコマンドで行います。mysqlとほぼ同じようにアクセスできます。
$ mycli -uユーザ名 -pパスワード -hホスト -Pポート番号
接続が完了すると次のようなコンソールに切り替わります。
$ mycli -uroot -pmysql -h192.168.99.100 -P32769
Version: 1.7.0
Chat: https://gitter.im/dbcli/mycli
Mail: https://groups.google.com/forum/#!forum/mycli-users
Home: http://mycli.net
Thanks to the contributor - Open Query Pty Ltd
mysql [email protected] :(none)>
以下にコンソール部分を抜き出して見ました。
mysql [email protected] :(none)>
コンソールの左側に表示されている項目の、それぞれの意味を説明します。最初のmysqlは接続しているデータベースの種別を表しています。たとえばperconaサーバといったmysql互換のデータベースを使っている場合は、そのデータベースの名前が以下のように表示されます。
percona [email protected] :(none)>
root@192.168.100と書かれている部分は、ユーザ名とサーバのIPが表示されています。(none)と書かれている部分は現在接続しているデータベースを表示します。この場合は接続しているデータベースはありません。たとえばデータベース名にzipcodeを指定してログインした場合、は以下のように(none)と書かれた部分がzipcodeに変わります。
mysql [email protected] :zipcode>
その他のMySQLへの接続方法に関するmycliのオプションを確認したい場合は、--help
オプションを付けて実行しましょう。以下のように確認できます。
$ mycli --help
Usage: mycli [OPTIONS] [DATABASE]
Options:
-h, --host TEXT Host address of the database.
-P, --port INTEGER Port number to use for connection. Honors
$MYSQL_TCP_PORT
-u, --user TEXT User name to connect to the database.
-S, --socket TEXT The socket file to use for connection.
-p, --password TEXT Password to connect to the database
--- 省略 ---
次項からはmycliの便利な機能についていくつか紹介します。
自動補完機能
mycliでは、SQLの自動補完機能が有効になっています。こちらを使うと長いカラム名や単複の難しいテーブル名などをshow tablesやshow create table等で確認しなくても入力がしやすくなります。
たとえば、SELECT COUNT(*) FROM zipcode WHERE town='桜丘町';
という桜丘町が全国に何件あるか調べるクエリがあったとします。それを実行する際にSと入力すると図1 のようにSQLのキーワードの候補が表示されます。
図1 Sを入力した際の候補
選択は↑↓キーで選択できます。Enterキーを押すとキーワードが決定されます。
続けてスペースを入力すると、列名に使えるSQLのキーワードが表示されます(図2 ) 。
図2 スペース入力後の補完
どんどん入力を進めていき、FROM句を入力しようとすると、選択できるテーブルが表示されます(図3 ) 。今回はzipcodeテーブル1つだけですが、テーブルが増えれば増えるほど目で見て選択するほうが楽になります。またテーブル名がうろ覚えだったとしても、覚えている範囲でテーブル名を入力することで目当てのテーブルを探すこともできます。
図3 テーブルの補完
続いてWHERE句の補完です。読み込んだテーブルのカラムやSQLのキーワードが候補として表示されていることがわかります(図4 ) 。
図4 WHERE句の補完
このようにSQLを入力するごとに候補が表示され、mycliに支援を受けながらSQLを簡単に作成することができます。
また、mysqlクライアントでも--skip-auto-rehash
を指定してない場合は補完機能を利用できますが、大文字小文字を分けて判断されてしまうことやMySQLサーバの設定によっては性能が劣化してしまうことがあるので注意が必要です。
クエリのお気に入り機能
mycliでは、よく使うクエリに名前を付けて保存することができます。集計などで複雑なSQLを入力する場合などに便利です。何回も入力する場合はバッチにしてしまうかもしれませんが、割りと便利な機能です。使い方は次の表のとおりです。
コマンド 説明
\f 今までに登録したクエリの一覧表示
\f name 登録したクエリの実行
\fs name query クエリの登録
\fd name 登録したクエリの削除
以下でこれらの機能を試してみようと思います。はじめに、countという名前でzipcodeテーブルの件数を数えるクエリを、\fsを使い登録します。
mysql [email protected] :zipcode> \fs count SELECT COUNT(*) FROM zipcode
Saved.
Time: 0.001s
登録が終わったので、\fを使い登録の確認をします。
mysql [email protected] :zipcode> \f
+--------+------------------------------+
| Name | Query |
|--------+------------------------------|
| count | SELECT COUNT(*) FROM zipcode |
+--------+------------------------------+
No favorite query:
Time: 0.001s
無事登録が確認できたので、次に登録したcountのSQLを実行しています。登録したSQLがそのまま実行されているのがわかると思います。
mysql [email protected] :zipcode> \f count
> SELECT COUNT(*) FROM zipcode
+------------+
| COUNT(*) |
|------------|
| 123867 |
+------------+
Time: 0.032s
最後に登録したクエリを削除して、本当に消えているかを確認してみました。
mysql [email protected] :zipcode> \fd count
simple: Deleted
Time: 0.001s
mysql [email protected] :zipcode> \f
No favorite queries found.
Favorite Queries are a way to save frequently used queries
with a short name.
無事消えていることが確認できました。また、何も登録していない状態で\fを実行すると、manコマンドの様にお気に入りの説明が開きます。説明から抜けたい場合はqを入力してください。
History & Search
MacやLinuxの多くのターミナルではCtrl + r
を入力すると過去に実行したコマンドを履歴から探す事ができます。mycliでも同様にCtrl +r
を入力することによって過去に実行したSQL文を探しだすことができます。
mysqlクライアントでは今回説明は行いませんが、~/.editrc
内で適切に設定することで利用できます。
まとめ
今回は便利なMySQLクライアントの一種であるmycliについて紹介を行いました。mycliにはたくさんの機能があり、今回紹介しきれなかった機能もたくさんあります。mycliのその他の機能が気になる場合は公式のドキュメントを参照して試してみてください。mycliの機能は便利なものが多いので、ぜひ一度使ってみてはいかかでしょうか。