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