MySQL Shellは、第226回 MySQL Shellを使ってdumpしてみるや、第216回 MySQL ShellでJavaScriptを使ってMySQLを操作してみよう
こうした関数を複数組み合わせて実行したい場合もあると思いますが、そんなときにインタラクティブなシェル画面で逐次入力し実行させるのは大変だと思います。こういった場合に慣れたエディタを使用できたら、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.
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やコードを複数行をまとめて実行したい場合もあると思うので、ここで紹介した方法を頭の片隅に入れておくと便利だと思います。