今回は、第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.
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.メソッドを使用して、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に切り替えて使う方法もあります。今後は、データ操作などに関しても紹介していきたいと思います。