MySQL道普請便り

第216回MySQL ShellでJavaScriptを使ってMySQLを操作してみよう[その1]

今回は、第214回 MySQL ShellでMySQLに接続してみるで紹介させていただいたMySQL Shellを使ってJavaScriptで操作する方法を紹介したいと思います。

検証環境

今回は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.0.36

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

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

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

mysql>  select version();
+-----------+
| version() |
+-----------+
| 8.0.36    |
+-----------+
1 row in set (0.01 sec)

MySQL ShellでJavaScriptを使ってみる

MySQL Shellで接続をする

今回も第214回と同様に、DockerのイメージにあるMySQL Shellを使用して接続をしていきます。まずは対話モードでも実行を行いたいので、対話モードでJavaScriptを実行します。

立ち上げたDockerコンテナの中に入るために、コンテナIDを調べます。

$  docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED          STATUS
     PORTS                                                 NAMES
5480636b729f   mysql:8.0.36                        "docker-entrypoint.s…"   12 seconds ago   Up 10 seconds
     33060/tcp, 127.0.0.1:3307->3306/tcp                   elastic_lederberg

続いて、docker execコマンドを使用してMySQLのコンテナ内部に入ります。その後、mysqlshコマンドでログインを済ませます。

$ docker exec -it 5480636b729f bash
# mysqlsh
〈中略〉
 MySQL  localhost  JS >

中略された部分に関して詳細が知りたい方は、第214回で説明を行っているので、そちらを参照してください。

アクティブな言語の変更に関して

特に変更していなければ、MySQL localhost JSといった表示でJavaScriptがデフォルトで宣言された状態であることがわかります。

MySQL Shellではアクティブな言語として、JavaScript以外にもPythonやSQLを指定して利用することができます。

変更には、\jsでJavaScriptに、\pyでPythonに、\SQLでSQLに、それぞれ変更することができます。ターミナルの左側の部分がそれぞれ変更されることを確認してみましょう。

 MySQL  localhost  JS > \py
Switching to Python mode...
 MySQL  localhost  Py > \sql
Switching to SQL mode... Commands end with ;
 MySQL  localhost  SQL >

上記のように、それぞれのアクティブな言語を表す部分が変更されていることがわかります。SQLの時だけCommands end with ;というエラーが発生しています。これは\sql以降にSQLを書くと、以下のように書いたSQLを直接実行できる機能と衝突している可能性が高そうです。

 MySQL  localhost  JS > \sql show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.0009 sec)

\sqlを使用してアクティブな言語をSQLにすると、今までのmysqlclientと同じように扱うことができます。ログインした際にアクティブな言語がJavaScriptでなかった場合に以降のコードを試したい場合は、\jsを実行してJavaScriptをアクティブな言語にしておいてください。

JavaScirptでデータベースとテーブルを操作してみる

さて、引き続きJavaScriptを使ってデータベースやテーブルを操作する方法を確認していきます。接続には、mysqlxというデフォルトで定義されているオブジェクトを使用して接続を確立します。

var mySession = mysqlx.getSession('root:my-secret-pw@localhost');

mysqlxのgetSessionメソッドにユーザ名:パスワード@接続先データベースの形式で定義した文字列を渡します。するとセッションに関するオブジェクトができるので、varで定義したmySessionにセッションデータが代入されます。このmySessionを使用してデータを操作していくことになります。残念ながらconstもletも無いため、変数はvarで定義する必要があります。

どういった操作が可能であるか確認するために、Object.keys()メソッドを使用して、mySessionに存在しているメソッドを確認してみましょう。

 Object.keys(mySession);
[
    "uri",
    "sshUri",
    "defaultSchema",
    "currentSchema",
    "_enableNotices",
    "_fetchNotice",
    "_getSocketFd",
    "close",
    "commit",
    "createSchema",
    "dropSchema",
    "getCurrentSchema",
    "getDefaultSchema",
    "getSchema",
    "getSchemas",
    "getSshUri",
    "getUri",
    "help",
    "isOpen",
    "quoteName",
    "releaseSavepoint",
    "rollback",
    "rollbackTo",
    "runSql",
    "setCurrentSchema",
    "setFetchWarnings",
    "setSavepoint",
    "sql",
    "startTransaction"
]

上記のようなメソッドが生えていることがわかりました。そこで、とりあえずtestデータベースを作ってみたいと思います。データベースはSchemaをという名前が付いているメソッドで操作ができます。今回はcreateSchemaを使用してデータベースを作成していきます。

 MySQL  localhost  JS > mySession.createSchema('test');
<Schema:test>

このように作成できました。結果を確認したい場合は、getSchemasを実行してみます。

 MySQL  localhost  JS > mySession.getSchemas()
[
    <Schema:information_schema>,
    <Schema:mysql>,
    <Schema:performance_schema>,
    <Schema:sys>,
    <Schema:test>
]

これでデータベースの操作ができるようになりました。削除したい場合はdropSchemaを実行すれば、削除することができます。

 MySQL  localhost  JS > mySession.dropSchema("test");
 MySQL  localhost  JS > mySession.getSchemas()
[
    <Schema:information_schema>,
    <Schema:mysql>,
    <Schema:performance_schema>,
    <Schema:sys>
]

消せたことがわかったので、もう一度testデータベースを作成して置きましょう。

 MySQL  localhost  JS > mySession.createSchema("test");
<Schema:test>
 MySQL  localhost  JS > mySession.getSchemas()
[
    <Schema:information_schema>,
    <Schema:mysql>,
    <Schema:performance_schema>,
    <Schema:sys>,
    <Schema:test>
]

続いて、テーブルの操作を行いましょう。テーブルはCollectionと名前の付くメソッドで操作できます。セッションからschemaを指定したオブジェクトのメソッド一覧を眺めてみましょう。

getSchema()メソッドを使うことで、Schemaオブジェクトを操作できるようになります。

 MySQL  localhost  JS > Object.keys(mySession.getSchema("test"));
[
    "name",
    "session",
    "schema",
    "createCollection",
    "dropCollection",
    "existsInDatabase",
    "getCollection",
    "getCollectionAsTable",
    "getCollections",
    "getName",
    "getSchema",
    "getSession",
    "getTable",
    "getTables",
    "help",
    "modifyCollection"
]

createCollectionでテーブルの作成が、dropCollectionでテーブルの削除が行えます。getCollectionで指定すると、データベースと同様にテーブルでの操作が行えるようになります。それぞれ確認してみましょう。

 MySQL  localhost  JS > mySession.getSchema("test").createCollection("testTable");
<Collection:testTable>
 MySQL  localhost  JS > mySession.getSchema("test").getCollections();
[
    <Collection:testTable>
]
 MySQL  localhost  JS > mySession.getSchema("test").dropCollection("testTable");
 MySQL  localhost  JS > mySession.getSchema("test").getCollections();
[]

これらは、アクティブな言語をSQLに変えても確認ができます。

 MySQL  localhost  JS > \sql
Switching to SQL mode... Commands end with ;
 MySQL  localhost  SQL > use test
Default schema set to `test`.
Fetching global names, object names from `test` for auto-completion... Press ^C to stop.
 MySQL  localhost  test  SQL > show tables;
+----------------+
| Tables_in_test |
+----------------+
| testTable      |
+----------------+
1 row in set (0.0018 sec)

作成されたテーブルは下のようになっており、jsonを入れられるようになっています。

 MySQL  localhost  test  SQL > show create table testTable\G;
*************************** 1. row ***************************
       Table: testTable
Create Table: CREATE TABLE `testTable` (
  `doc` json DEFAULT NULL,
  `_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
  `_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
  PRIMARY KEY (`_id`),
  CONSTRAINT `$val_strict_61955669AB5E8C5C8988F15115FF8F9868284990` CHECK (json_schema_valid(`_json_schema`,`doc`)) /*!80016 NOT ENFORCED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.0010 sec)
ERROR: 1065 (42000): Query was empty

まとめ

今回は、MySQL Shellのアクティブな言語を切り替える方法と、JavaScriptで書いたコードでデータベースやテーブルを操作する方法を紹介させていただきました。SQLに慣れ親しんでいる場合はSQLに切り替えて使う方法もあります。今後は、データ操作などに関しても紹介していきたいと思います。

おすすめ記事

記事・ニュース一覧