MySQL道普請便り

第244回MySQL Shellで好きなエディタを使用する

MySQL Shellは、第226回 MySQL Shellを使ってdumpしてみるや、第216回 MySQL ShellでJavaScriptを使ってMySQLを操作してみよう[その1]でも紹介したように、高機能な関数を使用してさまざまな事ができるようになりました。

こうした関数を複数組み合わせて実行したい場合もあると思いますが、そんなときにインタラクティブなシェル画面で逐次入力し実行させるのは大変だと思います。こういった場合に慣れたエディタを使用できたら、SQLやJavaScript、Pythonでいろいろなコードを書くときに支援を受けることができて便利だと思いませんか?

今回は、今まで紹介してきたMySQL ShellでSQLやコードを書く際に好きなエディタを使用する方法を紹介します。

検証環境

今回はdockerで建てたMySQLを使用します。以下のコマンドでdockerを建てて、ローカルからアクセスをします。

% docker run --platform linux/x86_64 -p 127.0.0.1:3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_USER=kk2170 -e MYSQL_PASSWORD=my-secret-pw -d mysql:8.4.3

今回はMySQL Shellをインストールして実行していきますが、一旦従来のmysqlクライアントでアクセスが可能であることを確認しましょう。方法は以下の通りになります。

% mysql -uroot -pmy-secret-pw -h127.0.0.1 -P3307

執筆時点では、以下の通りMySQL 8.4.3を使用しています。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.4.3     |
+-----------+
1 row in set (0.00 sec)

エディタを起動してみる

では起動してみましょう。といっても非常に簡単に使え、\editで起動できます。

MySQL  SQL > \edit

そうすると、以下のようにエディタが開くと思います。

エディタの起動画面
エディタの起動画面

私はデフォルトのエディタをvimに設定していたのでvimが起動しています。vimなので:qを押して抜けると、通常のMySQL Shellの状態に戻ります。

クエリを書いてみる

では、実際に複数行にわたるクエリを書いて実行してみましょう。\editでエディタを起動して、次に紹介するクエリを入力、実行します。第241回 MySQLでtimestamp型のカラムを部分一致で検索するで作成したデータベースとテーブルを作るクエリです。

開いたエディタに下のSQLを入れてみましょう。

CREATE DATABASE timestamptest;
use timestamptest
CREATE TABLE example_table (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

この入力が終わった状態でエディタを終了すると、ターミナルが以下のような画面になって、複数行入力を行った状態になります。

シェルの入力待ち画面
シェルの入力待ち画面

この状態でEnterを押すと、バッチ実行されます。

このように、エディタで複数行のSQLを作成と実行ができるようになりました。今回はSQLモードでの実行を行いましたが、これはPythonモードでもJavaScriptモードでも起動することができます。

 MySQL  127.0.0.1:3307 ssl  JS > \edit
 MySQL  127.0.0.1:3307 ssl  JS > let test = "test";
                               > print(test);
                               >
test

SQLよりもこのようなスクリプトを書く際に、真価を発揮する事になるかもしれません。

履歴を確認する

まとめて実行したSQLの履歴を確認したい事があると思います。その場合は通常のhistoryに保存されているため、普通に確認ができます。

ただし、一度に実行したSQLが1行になってしまい、単純に1行にまとめられてしまうため、今回のuse timestamptestのように改行で分かれている場合は、セミコロン無しで通るSQLがあったとしてもエラーになってしまうので注意しましょう。

 MySQL  127.0.0.1:3307 ssl  timestamptest  SQL > CREATE DATABASE timestamptest;use timestamptest CREATE TABLE example_table (     id INT AUTO_INCREMENT PRIMARY KEY,     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

履歴では上記のようなクエリになってしまうため、drop databaseを適用してもう一度流してみると以下のような結果になります。

 MySQL  127.0.0.1:3307 ssl  SQL > drop database timestamptest;
 MySQL  127.0.0.1:3307 ssl  SQL > CREATE DATABASE timestamptest;use timestamptest CREATE TABLE example_table (     id INT AUTO_INCREMENT PRIMARY KEY,     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Query OK, 1 row affected (0.0072 sec)
Incorrect number of arguments for use command, usage:
\use <schema_name>

use <database>の引数の数が合っていないというエラーが発生しています。今度はセミコロンを追加して実行してみましょう。

 MySQL  127.0.0.1:3307 ssl  SQL > drop database timestamptest ;
Query OK, 0 rows affected (0.0162 sec)
 MySQL  127.0.0.1:3307 ssl  SQL > CREATE DATABASE timestamptest;use timestamptest; CREATE TABLE example_table (     id INT AUTO_INCREMENT PRIMARY KEY,     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Query OK, 1 row affected (0.0050 sec)
Default schema set to `timestamptest`.
Fetching global names, object names from `timestamptest` for auto-completion... Press ^C to stop.
Query OK, 0 rows affected (0.0218 sec)

このように普段省略している構文でエラーになってしまうことも起こるので、ヒストリーから\editで編集したSQLを表示して実行する場合には、構文エラーにならないか注意して実行するようにしましょう。

エディタを変更してみる

今回私はvimを起動していましたが、他のエディタを使用することもできます。

MySQL Shellで\editを実行すると、環境変数EDITORで指定されたエディタが起動します。エディタとしてVS Codeも使用できますが、その際は-wオプションをつける必要があります。VS Codeの場合はタブやVSCodeを閉じるとエディタで作成したコードが入力されます。

shellが使える言語の場合はEDITOR環境変数で指定することで選択ができます。

export EDITOR=vim      # Vim を使いたい場合
export EDITOR=nano     # Nano を使いたい場合
export EDITOR=code -w  # VS Code を使いたい場合(-w は "wait")

起動時に指定したい場合は、下記のようにmysqlshを起動するタイミングで環境変数として渡してあげると、\editで起動するエディタを変更できます。

EDITOR="code -w" mysqlsh [email protected]:3307 --sql --password

WindowsのPowerShellの場合も、環境変数設定を指定することで選択できます。

$env:EDITOR = "notepad"        # メモ帳を使う
$env:EDITOR = "code -w"        # VS Code(-w は待機モード)

このように\editで起動するエディタは自由に変更することができます。

現在起動する設定になっているエディタが何かは、JSモードにはなりますがgetEnvで確認することができます。

 MySQL  127.0.0.1:3307 ssl  timestamptest  JS > os.getenv("EDITOR")
vim

このように、現在はvimが設定されていることがわかります。普段使い慣れていないエディタが設定されている場合、エディタを終了するのも難しかったりすることもあるので、いまEDITORに何が設定されているか確認してから試してみても良いかもしれません。

まとめ

今回はMySQL Shell上でエディタを開く方法を紹介しました。今では任意のエディタを使って、複数行のSQLを書けるようになりました。第232回で紹介したMySQL Shell for VS Codeを使用する場面が増えていくと思いますが、MySQL ShellでMySQLにアクセスしている状態でSQLやコードを複数行をまとめて実行したい場合もあると思うので、ここで紹介した方法を頭の片隅に入れておくと便利だと思います。

おすすめ記事

記事・ニュース一覧