0Pricing
SQL Academy · レッスン

テストデータによるデータベースのシード

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブログのモデリング:ユーザー、投稿、コメント
  2. キーと型の選択
  3. 一般的なクエリ向けインデックス
  4. テストデータによるデータベースのシード
← SQL Academyに戻る