ほんじゃらねっと

ダイエット中プログラマのブログ

PostgreSQLのgenerate_series関数でテスト用データを作成する

f:id:piro_suke:20161102010901j:plain

これまでテスト用にたくさんデータを作成する時は、

PythonやらNode.jsやらでプログラムを書いてた。

blog.honjala.net

PostgreSQLならgenerate_seriesという連続値生成関数を利用することで

SQLだけで手軽にデータ生成できる、ということを発見したので、

今回は上記の記事と同じようなテストデータをSQLで作成してみる。

環境はPostgreSQL 9.5。

下記のようなテーブルを作成する。

drop table if exists bulk_test_items;
create table bulk_test_items(
  id serial not null,
  item_cd varchar(100),
  name varchar(100),
  created timestamp default current_timestamp,
  primary key(id)
);

そして、generate_seriesとinsert-selectを組み合わせたデータ生成SQLを作成する。

insert into bulk_test_items(item_cd, name, created)
select
  to_char(i, 'FM0000000000'),
  format('テスト商品%s', i), 
  clock_timestamp()
from
  generate_series(1, 10) as i
;

これで下記のようなデータが生成される:

 id |   item_cd   |     name     |          created
----+-------------+--------------+----------------------------
  1 |  0000000001 | テスト商品1  | 2016-11-02 00:42:30.138823
  2 |  0000000002 | テスト商品2  | 2016-11-02 00:42:30.147692
  3 |  0000000003 | テスト商品3  | 2016-11-02 00:42:30.14774
  4 |  0000000004 | テスト商品4  | 2016-11-02 00:42:30.147766
  5 |  0000000005 | テスト商品5  | 2016-11-02 00:42:30.147788
  6 |  0000000006 | テスト商品6  | 2016-11-02 00:42:30.14781
  7 |  0000000007 | テスト商品7  | 2016-11-02 00:42:30.147832
  8 |  0000000008 | テスト商品8  | 2016-11-02 00:42:30.147855
  9 |  0000000009 | テスト商品9  | 2016-11-02 00:42:30.147878
 10 |  0000000010 | テスト商品10 | 2016-11-02 00:42:30.147901
(10 行)

なんて簡単なんでしょう。

generate_seriesに渡すパラメータを変更すれば数万件のデータも作成できる。

9.24. 集合を返す関数

おわり

いいもの発見した、と思ってたら

既にもっと色々なパターンを紹介してくれている解説記事が公開されていた。

lets.postgresql.jp

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)