0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

テスト用の INSERT を手で書くのがしんどくて、ブラウザだけで対処できるツールを作った

0
Posted at

\検証用のデータを用意するとき、だいたい同じところで止まりませんか。

テーブルは揃っている。FK もある。あとはテストデータだけあればいいのに、複数〜十数のテーブルに INSERT を手で書く必要があって、しかも親テーブルから順に書かないと制約で落ちる。件数を増やしたいだけなのに、コピペの修正に半日かかる、みたいな状況ってそこそこあると思います。

そういう場面用に SQL Data Creator という Web ツールを作りました。
制約の強めの会社でも使えるように、ブラウザだけで動きます。サーバーにスキーマを送ることもありません。

対応している DB

プロジェクト作成時(またはヘッダー)で、次の 6 つから選べます。

DB CREATE / INSERT の方言まわり
MySQL AUTO_INCREMENT、識別子の扱いなど
PostgreSQL SERIAL / UUID / TIMESTAMPTZ など
MariaDB 基本は MySQL 寄り。UUID 型も選べる
Oracle 識別子が大文字寄り、VARCHAR2 / NUMBER など
SQLite 型の種類は少なめ。その分シンプル
SQL Server NVARCHAR / DATETIME2 / UNIQUEIDENTIFIER など

選んだ DB に合わせて、画面上で選べる型や、出力される CREATE / INSERT の書き方が変わるようにしています。

01-welcome.png


このツールの使い方

ざっくり言うと、次の流れです。

  1. 対象 DB を選ぶ
  2. テーブルとカラムを定義する(手入力でも、DDL / ORM の貼り付けでも可)
  3. リレーションを確認する
  4. カラムごとの生成ルールを必要なら調整する
  5. CREATE / INSERT を出してコピー or ダウンロード

一番こだわったのは FK を考慮した順番で INSERT を出す ところです。親 → 子の並びを自分で直さなくていいようにしています。

フレームワーク付属の faker や factory と違うのは、「アプリのコードを書かずに、SQL として出力できる」点です。逆に、マスキング済みの本番ダンプが既にあるなら、そちらの方が早い場面もあります。このツールは ダンプが無い/まだスキーマ段階 のときに一層活躍できる、という視点で作りました。

具体例:DDL を貼って INSERT まで

たとえば手元にこういう DDL があるとします。

CREATE TABLE users (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  name VARCHAR(100) NOT NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE posts (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id BIGINT UNSIGNED NOT NULL,
  title VARCHAR(200) NOT NULL,
  body TEXT,
  CONSTRAINT fk_posts_user FOREIGN KEY (user_id) REFERENCES users(id)
);

左の「スキーマ取込」で入力形式に CREATE TABLE (DDL) を選び、貼り付けてプレビュー → 取り込み、です。

対応している入力は DDL 以外にもあります。

  • Prisma schema
  • Rails の schema.rb
  • TypeORM Entity
  • Django models

ORM はバージョン差や方言があるので、すべてを完全には拾いきれません。なので、一通り実務で使える範囲はカバーしていますが、警告が出たら取り込み後の「テーブル定義」で直す想定にしています。

03-import-dialog.png

取り込んだあとは、テーブル定義で件数(何行出すか)を変えられます。たとえば users を 10 件、posts を 100 件、といった指定です。

06-schema-filled.png

DDL に FK があれば、「リレーション」定義も作成されます。リレーションは一覧と ER 図を切り替えられ、テーブルをつなぐ線をクリックすると編集できます。

08-er-diagram.png

ただし、取込直後の生成ルールはデフォルト(ランダム)のままです。user_id が親の users.id を参照するようにしたい場合は、「生成ルール」で該当カラムを「外部キー」に切り替えるか、リレーション画面から関係を追加・確定してください。

「SQL生成」を押すと、だいたいこういう感じの INSERT が出ます(値はランダムなので毎回違います)。

INSERT INTO `users` (`id`, `email`, `name`, `created_at`) VALUES
  (1, 'aR9mK2xQp1', 'bT2nH8cL0w', '2024-03-12 08:14:22'),
  (2, 'cU4pL9mN3s', 'dV5qJ1kR7y', '2023-11-01 19:02:05');

INSERT INTO `posts` (`id`, `user_id`, `title`, `body`) VALUES
  (1, 2, 'eW6...', 'fX7...'),
  (2, 1, 'gY8...', 'hZ9...');

メールらしい値が欲しければ、email カラムの生成ルールを「メールアドレス」に変えます。created_at を DB の現在時刻にしたいなら、生成ルールで DB関数(MySQL なら候補の now()current_timestamp)に切り替えます。その場合は '2024-...' ではなく、選んだ式がそのまま SQL に入ります。

ポイントは次の 2 つです。

  • INSERT の並びが親テーブルから先(リレーション定義がある場合)
  • 外部キー生成ルールを付けたカラムは、親側で実際に生成された値を参照できる

手で書くと一番ミスしやすいところが、ここです。

10-sql-preview.png


生成ルールで「どんな値を出すか」を決める

テーブル構造は「テーブル定義」、値の出し方は「生成ルール」で決めていきます。左メニューの「生成ルール」を開くと、カラムごとにルール種別を選べます。デフォルトのままでも動きますが、検証で欲しい形があるならここで調整できます。

09-data-rules.png

ルール 向いているもの 補足
ランダム とりあえず埋めたい列 型に応じた適当な値(初期状態)
連番 整数の id など 1 から順に増える
リスト ステータス、区分値 候補から選ぶ(種別として選択)
正規表現 決まったフォーマットの文字列 シンプルなパターン向け
メールアドレス メール列 ランダムなメールを生成
外部キー FK 列 先にリレーション定義が必要。親の値を参照
カスタム 固定値や接頭辞付き 値 + 任意で prefix / suffix。{index} で行番号
DB関数 日付・時刻列 候補から関数を選ぶ(後述)

データ型によって選べるルールが変わります。たとえば連番は整数向け、正規表現やメールは文字列向け、DB関数は日付・時刻向け、という具合です。

画面上で細かくいじりやすいのは カスタムDB関数 です。それ以外は「ルール種別を選ぶ」が中心で、詳細パラメータの UI はまだ薄い部分があります。

カスタムの例

値に test、接頭辞に u-{index}- と入れると、

u-1-test
u-2-test
u-3-test
...

のように出ます。デモ用のユーザーコードや、識別しやすい文字列を作りたいときに使っています。

外部キー

リレーションを定義したうえで、子側カラムのルールを「外部キー」にします。親テーブルに無い id を勝手に埋め込まない、という挙動になります。スキーマ取込で FK があればリレーション定義までは自動で入りますが、値の参照ルールまでは自動では切り替わりません。生成ルール画面で「外部キー」を選ぶか、リレーション画面から関係を追加してください。

DB関数の対応度合いについて

各 DB ごとの関数は一部対応しています。日付・時刻系のカラム向け がメインで、対象 DB ごとに用意した候補から選ぶ形にしています(任意の関数を手打ちする方式ではありません)。

選んだ式は SQL にそのまま挿入されます(文字列としてクォートされないです)。

DB 選べる関数
PostgreSQL now(), current_timestamp, clock_timestamp()
MySQL / MariaDB now(), current_timestamp
Oracle systimestamp, current_timestamp
SQLite current_timestamp, datetime('now')
SQL Server getdate(), sysdatetime(), current_timestamp

画面上の設定について

左メニューの構成は下記のようになっています。

メニュー 役割
テーブル定義 テーブル名・カラム・型・PK / UNIQUE / NULL・件数
リレーション FK のつながり。一覧と ER 図
生成ルール 上で書いた値の出し方
SQL確認 CREATE / INSERT の確認、コピー、ダウンロード
データ確認 表形式で中身を眺める
設定 テーマ(ライト / ダーク)、利用ガイド

プロジェクト名と DB 種別はヘッダーからも変えられます。保存は「プロジェクト保存」で、ブラウザの localStorage に保存されます。別 PC で作業したり共有したりしたい場合は、ヘッダーのエクスポート / インポートを使ってください。

右ペインの SQL プレビューは常時表示されます。CREATE は定義を編集するとすぐ追従し、INSERT は生成後に出てきます。

想定ユースケース

このツールが使えるのは、だいたい次のような状況を想定しています。

  • 結合テスト用に、ある程度まとまった件数の INSERT が欲しい
  • FK 付きのサンプル DB を、毎回手書きしたくない
  • まず動くデータを置いてからアプリ側を進めたい
  • 手元に DDL や Prisma / Rails / Django の定義がある

ぜひ、使ってみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?