カラムもユーザが定義できる CRUD アプリ「JSON DB Manager」を作った

Ruby On Rails の Scaffold 機能なんかを使うと、データの一覧・登録・編集なんかを行うバックエンドと、それに連動するフロントエンドを簡単に作ってくれたりする。

自分はこの機能がウェブアプリの本質だなぁーと思っていて、ほとんど全てのウェブアプリって、何らかのデータを永続化できればそれでいいのよね。

なので今回は、カラム定義をウェブ上で行えるウェブアプリを作ってみることにした。その名も「JSON DB Manager」

言語としては Node.js 製。Express のバックエンドに、Angular のフロントエンド。自分がよくアプリを作る時の鉄板構成。

イメージ的には、データベースの「1 テーブル」ごとに、JSON ファイルを一つ作り、カラム定義とデータを単一の JSON ファイルに保存している。バックエンドに実際に DB を使っても良いんだけど、もっとお手軽にしたいなと思って、あえて JSON ファイルを DB 的に使う構成にした。簡単にするために、ファイルロックなんかもしてないので危うい作りではある。w

JSON ファイルの内容はだいたい以下のようになっている。

{
  // DB 物理名 : JSON ファイル名と同じ。この場合「example.json」がこのファイル名
  "db-name": "example",
  // DB 論理名
  "db-display-name": "宿題提出済の生徒一覧",
  // カラム定義
  "columns": [
    // ID カラムは必須。シーケンス値と連動するカラム
    {
      "name": "id",
      "display-name": "ID",
      "type": "id",
      "required": true
    },
    // 任意のカラムを定義する : 以下は必須入力の「ユーザ名」カラム、みたいな感じ
    {
      "name": "user-name",
      "display-name": "ユーザ名",
      "type": "text",
      "required": true
    },
    // 任意のカラム : 値は任意入力で、日付を入力できるカラム
    {
      "name": "completed-at",
      "display-name": "完了日",
      "type": "date",
      "required": false
    }
  ],
  // シーケンス値 : 内部的に使用するだけ
  "seq": 2,
  // 実際のデータ
  "data": [
    {
      "id": 1,
      "user-name": "Miles Davis",
      "completed-at": "2020-05-07"
    },
    {
      "id": 2,
      "user-name": "Steve Vai",
      "completed-at": ""
    }
  ]
}

…こんな感じ。どういうテーブル名で、どういうカラムが定義されていて、実際のレコードも中に入っている、という、単一の JSON ファイルになっている。

ウェブアプリとしては、テーブル名・カラム定義を入力できる画面と、データを一覧表示・入力できる画面とがある感じ。対応しているデータ型としては、現時点では1行テキストと、年月日の Date 型のみ。ゆくゆくは、チェックボックスとかで Boolean を管理できるようにしたいとか、マスタも定義できるようにして、単一選択できるようなカラムもほしいな。

自分はこれを自作して、ジャンル別の ToDo リストというか、「観たい映画」「聴きたい音楽」「行きたい場所」みたいな、Wish List みたいなモノをまとめている。Always Free な OCI インスタンス上にデプロイしておいて、簡易的なパスワード認証で俺だけが使えるようにしている。

ひとまず自分がやりたいことはできていて良いかな。もし何か機能要望とかあれば GitHub Issues にドウゾ。