テストデータによるデータベースのシード
INSERT ... SELECTとgenerate_seriesで現実的なテストデータを生成し、簡単な分析クエリで検証します。
「テストデータによるデータベースのシード」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
シードデータを用意する理由
空のデータベースではバグが隠れてしまいます。現実的なデータが必要です:
- UI/E2Eテストを実行するため
- パフォーマンス特性(インデックス、クエリプラン)を検証するため
- アプリケーションをデモするため
手作業で記述するシード
少数の「フィクスチャ」行であれば、SQLまたはマイグレーションに手作業で記述します:
INSERT INTO users (id, email, full_name) VALUES
(1, 'alice@example.com', 'Alice Adams'),
(2, 'bob@example.com', 'Bob Brown');
SELECT setval('users_id_seq', (SELECT MAX(id) FROM users));大量投入にgenerate_seriesを使う
generate_seriesが役立ちます。投稿を1000件作成します:
INSERT INTO posts (author_id, title, body, published_at)
SELECT
((random() * 9 + 1)::int), -- random user 1-10
'Post number ' || g,
'Lorem ipsum body ' || g,
NOW() - (random() * INTERVAL '90 days')
FROM generate_series(1, 1000) AS g;ランダムな外部キー
ランダムな親行を選びます:
INSERT INTO comments (post_id, author_id, body)
SELECT
(SELECT id FROM posts ORDER BY random() LIMIT 1),
(SELECT id FROM users ORDER BY random() LIMIT 1),
'Sample comment ' || g
FROM generate_series(1, 5000) AS g;
-- Slow at scale — see next slide for a faster pattern.高速化:親のIDを事前キャッシュする
候補IDを一度だけマテリアライズします:
WITH u AS (SELECT id FROM users),
p AS (SELECT id FROM posts)
INSERT INTO comments (post_id, author_id, body)
SELECT
(SELECT id FROM p OFFSET floor(random()*1000)::int LIMIT 1),
(SELECT id FROM u OFFSET floor(random()*10)::int LIMIT 1),
'Sample comment ' || g
FROM generate_series(1, 5000) AS g;faker_fdwとツール
名前、住所、段落など、より充実したフェイクデータには次を使います:
faker_fdw— Python Fakerを提供するPostgres拡張機能- Nodeの
@faker-js/faker - スクリプト形式のDjango/Railsシーダー
大量インポートにはCOPYを使う
100万行を読み込む場合、COPYはINSERTより5~10倍高速です:
COPY users (email, full_name)
FROM '/tmp/seed_users.csv' WITH (FORMAT csv, HEADER true);シーケンスをリセットする
明示的なIDを指定して手動で行を挿入した場合は、今後自動生成されるIDが衝突しないよう、シーケンスを先に進めます:
SELECT setval('users_id_seq', (SELECT COALESCE(MAX(id), 0) FROM users));冪等なシード
何度実行しても安全なシードにします。UPSERTまたはTRUNCATE-then-INSERTを使用します:
INSERT INTO products (sku, name, price) VALUES
('A-001', 'Widget', 9.99)
ON CONFLICT (sku) DO UPDATE
SET name = EXCLUDED.name, price = EXCLUDED.price;現実的なデータ分布
テストは本番のデータ分布を反映すべきです。投稿の80%にコメントがなく、1%に1000件のコメントがあるなら、テストデータもそのようにしなければなりません。そうしないと、インデックスのクエリプランが誤解を招きます。
CIでシードを投入する
エンドツーエンドテストでは、マイグレーション後かつテストスイートの前にシードスクリプトを実行します。シードはバージョン管理に含めてください。
まとめ
よいシードとは、現実的なデータ、冪等なスクリプト、高速な読み込み(大量データにはCOPY)を備えたものです。
- 大量投入にはgenerate_series
- 繰り返し実行にはUPSERT
- 手動挿入後にはsetval
- 本番のデータ分布に合わせる
クイックチェック
テストデータを10,000行すばやく挿入したいとします。行番号を生成するPostgreSQLの関数はどれですか?
よくある質問
「テストデータによるデータベースのシード」レッスンは無料ですか?
はい。「テストデータによるデータベースのシード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「テストデータによるデータベースのシード」で何を学びますか?
INSERT ... SELECTとgenerate_seriesで現実的なテストデータを生成し、簡単な分析クエリで検証します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「テストデータによるデータベースのシード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ブログのモデリング:ユーザー、投稿、コメント
- キーと型の選択
- 一般的なクエリ向けインデックス
- テストデータによるデータベースのシード