MySQL

データベース管理ツール

macOS Catalina 10.15.7 / MySQL Server 5.7.16 / node v20.15.1
ユーザが作成した MySQLデータベースの定義情報を収集しデータベース化する。Webアプリケーションを介してそれらの情報を参照し、データベースの構造を容易に把握できるようにする。集めるのは、データベース名、テーブル名、テーブルのカラム情報として、フィールド名、データ型、ヌル値可否、主キーの設定とする(デフォルト値、Extra値も収集するが表示はしない)。
データベース、テーブル、カラムそれぞれに「タイトル」と詳細な説明等を記載できる「備考欄」を設け、Webから入力できるようにする。また個々のデータベースに対して、Webから SQLステートメントを実行できるようにする。

データベース定義情報の照会

データベース情報

データベース名、データベースのタイトル、remarksリンク、execSQLリンクが表示される。タイトルは入力可能であり、更新ボタンのクリックにより保存される。
[image1]
remarksリンクをクリックすると、データベースの備考欄が表示される。ここはテキストの入力が可能であり、更新ボタンのクリックにより保存される。
[image2]

テーブル情報/カラム情報の表示

データベース名(例では health)のリンクをクリックするとテーブル情報/カラムの情報を表示したページが別ウィンドウとして開く。テーブル名、テーブルタイトル、カラム情報としてフィールド名、カラムタイトル、データ型、キーの設定、ヌル値可否が表示される。
テーブルタイトルとカラムタイトルは入力可能である。また、Tableリンク、Columnリンクをクリックすると、それぞれの備考欄が表示され、テキストを入力することができる。入力したタイトルと備考は更新ボタンのクリックにより保存される。
[image3]
テーブルの備考を開いたとき
[image4]

SQLステートメントの実行

データベース情報ページの execSQLリンクをクリックすると、次に示す SQLステートメント実行ウィンドウが開く。ここでは、当該データベースにおいて任意の SQLステートメントを入力し実行することができる。
保存ボタンをクリックすると、入力した SQLステートメントをデータベースに保存する。次にウィンドウを開いたときに初期値として表示される。
[image5]
左側の テキストエリアにSQLステートメントを記述し実行ボタンをクリックする。SELECT文のように戻り値がある場合、右側のテキストエリアにデータを表示する。表示形式は、JSON形式、表形式のいずれにも対応し、表示中に切り替えることもできる。
本アプリケーションは SQLステートメントの複文の実行に対応していない。よって次のような SQL文は実行できない。
[image5]
複文を実行できるようにするには SQL接続時 multipleStatementsプロパティの設定によって可能だが、セキュリティの観点からお薦めはされてないようだ。
[補足] このアプリケーションはテスト版なので INSERT、UPDATEましてや DROPステートメント等のデータやデータベースの構成を変化させる命令も実行できてしまうが、実用上は制限するべきであろう。

テーブルベース管理ツールの作成手順

データベース管理ツールが利用するデータベースを作成する  SQLステートメント

データベース:db_management

構成テーブル

データベース情報:database_info

※入力項目は、データベース管理システムから入力/変更できるエリアで、項目の説明等を(主に日本語で)記述するためのエリア

テーブル情報:table_info

カラム情報:column_info

idx:順序番号について

各レコードには表示順を維持するために連番として順序番号を振る。
カラム情報テーブル(column_info)の主キーはデータベース名+テーブル名+フィールド名であるが、SELECTステートントを実行したときに出力レコードがフィールド名の昇順に並んでしまうのは問題である。本来はフィールドを定義した順、つまり CREATE TABLEステートメントに記述した順に表示されて欲しい。
対応としてはテーブルのフィールドに順序番号を追加し、SELECT文の実行時に ORDER BY句を指定するようにする。カラム情報テーブルのデータは DESCステートメントの出力レコードを利用するが、出力順は CREATE TABLEステートメントで定義したカラムの並びと同じになるので、単純にその順番を振ればよい。
なお、データベース情報テーブルとテーブル情報テーブルについてはそれぞれ SHOWステートメントの出力を利用するが、これはデータベース名、テーブル名の昇順で出力されるので主キーの昇順と順序番号は等しくなる。このことから順序番号は本来必要はないが、処理の一貫性という観点から同様に振っている。
なお、SELECTステートメントの結果が主キーの昇順に並ぶのは、MySQLの実装依存である。テーブルのレコードは数学的な集合(SET)なので順序という概念がない。並びを保証するためには必ず ORDER BYを指定するというのが SQLの仕様になっている。

MySQLからデータベース定義情報を取得する

データベース管理ツールが対象とするデータベースのデータベース名、テーブル名、かラム定義情報を SQLステートメントを使って取得し、それぞれテキストファイルに出力する。各レコードにはデータの出力順に連番を振る。レコードのフィールドは tabキーで区切る。
JavaScriptソースコード getDefinition.js
入力: MySQL
出力: database.txt / table.txt / column.txt
データベース情報 database.txt
データベース名:連番
SHOW DATABASES ステートメントで取得する
テーブル情報 table.txt
データベース名:テーブル名:連番
USE ステートメントで対象のデータベースに移り、SHOW DATABASES ステートメントで取得する
カラム情報 column.txt
データベース名:テーブル名:フィールド名:Type:Null:Key:Default:Extra:連番
DESC "テーブル名" ステートメントで取得する

データベース定義情報を db_managementにアップロードする

JavaScriptソースコード updateMgmtDB.js
入力: database.txt / table.txt / column.txt
出力: MySQL
SQLステートメントによりテキストファイルの定義データを「db_management」データベースにアップロードする。レコードの追加は INSERTステートメントで行う。
データベース定義の追加や変更があった場合もこの処理を行う。定義の変更の場合は、ユーザ入力項目のタイトルと備考はそのまま残し、それ以外のフィールドを UPDATEコマンドにより更新する。ファイルにないレコードが、データベースにある場合は定義が削除されたときである。この場合は、データベースのレコードを DELETEステートメントで削除する。

Webアプリケーション

データベース定義情報を照会する仕組みはローカルネットーワークを介した Webアプリケーションとする。サーバは node.jsで構築し、クライアントのリクエストに応じて MySQLとデータの照会・更新を行う。
クライアント

[補足] 「データベース管理ツール」開発テスト

データベース管理ツールの開発にあたり作成した「テスト項目書」と、それを検証するための「テスト手順書」を参考のために示す。(アプリケーションの開発/保守に関わるテストや評価についての考え方、手法などいつかまとめてみたいと考えている)