読者です 読者をやめる 読者になる 読者になる

DDLからダミーデータを自動生成するData::Generator::FromDDLを作りました

開発時に、ダミーデータを大量にDBに入れたい場面がありますが(SQLの実行計画やスケーラビリティを確認したい時など)、 DBのDDLを変更する度にデータ生成のスクリプトを書き直すのはめんどくさいですよね。

そこで、CREATE TABLE文やALTER TABLE文などのDDLから、適切なダミーデータを自動生成するData::Generator::FromDDLというCPANモジュールを作りました。

https://metacpan.org/pod/Data::Generator::FromDDL https://github.com/addsict/Data-Generator-FromDDL

インストール

$ cpanm Data::Generator::FromDDL

インストールすると datagen_from_ddl(1) というCLIのコマンドもインストールされるので、その使い方を説明したいと思います。

使い方

datagen_from_ddl(1)DDLの書かれたファイル(もしくは標準入力)を受け取って、ダミーデータを作成するINSERT文を標準出力に出力します。

$ echo 'CREATE TABLE T (a int PRIMARY KEY);' | datagen_from_ddl -n 3 --pretty

INSERT INTO
    `T` (`a`)
VALUES
    (1),
    (2),
    (3);

標準出力に出力されるので、そのままMySQLクライアントなどにパイプで渡せます。

$ datagen_from_ddl -n 3 ddl.sql | mysql -u user -p mydb

また、外部キー制約がある場合には制約を満たす順番でデータを生成します。

-- ddl.sql
CREATE TABLE A (
    a int,
    FOREIGN KEY (a) REFERENCES B (b)
);

CREATE TABLE B (
    b int PRIMARY KEY
);

このようにAテーブルのaカラムBテーブルのbカラムを参照する場合、B→Aの順番にデータが生成され、aカラムbカラムの値からランダムなものが選ばれます。

$ datagen_from_ddl -n 3 ddl.sql

INSERT INTO
    `B` (`b`)
VALUES
    (1),
    (2),
    (3);

INSERT INTO
    `A` (`a`)
VALUES
    (3),
    (2),
    (3);

その他、テーブルごとに異なるレコード数を生成するオプションなどがありますが、詳しくは datagen_from_ddl -h を見てみてください。

現状の制限

ツールをシンプルに保つためにいくつか制限があります。

  • 制約(主キー制約など)は全て数値型のみ
  • 複合主キーや複合外部キーには未対応
  • 使用できるデータ型は以下の通り
    • (unsigned) BIGINT
    • (unsigned) INT
    • (unsigned) MEDIUMINT
    • (unsigned) SMALLINT
    • (unsigned) TINYINT
    • TIMESTAMP
    • CHAR
    • VARCHAR
    • TINYTEXT
    • TEXT
    • MEDIUMTEXT
    • ENUM

終わりに

アプリケーションの開発時にはDDLは都度変化していくものです。 そんな場面に是非一度使ってもらえたらなと思います。

バグ報告・機能要望などありましたらこちらまで!  https://github.com/addsict/Data-Generator-FromDDL