3秒でわかる
開発環境やテスト環境に最初から入れておく初期データ。空の DB では動作確認もデモもできないため、誰が実行しても同じ状態を作れる形で用意します。
30秒図解
もう少し詳しく
どういうものか
シードデータは、作ったばかりのデータベースに最初から流し込んでおくデータのことです。種 (seed) をまくように、空のテーブルへ最初の中身を入れることからこう呼ばれます。
中身は 2 種類に分かれます。ひとつは、都道府県一覧や商品カテゴリ、権限の区分のように本番環境でも必要なマスタデータ。もうひとつは、開発中に画面を確認するためのダミーのユーザーや注文で、こちらは本番には入れません。この 2 つを別のスクリプトに分けておくのが実務での定石です。
なぜ必要か
データが空の状態では、一覧画面は何も出ず、ページ送りも並べ替えも検証できません。開発者が手作業でフォームから登録して確認する運用にすると、人によって作るデータが違い、「自分の環境では再現しない」不具合が生まれます。
新しく参加した人が git clone して数コマンドで動く状態になるかどうかも、シードの有無で決まります。テストでも、実行前に同じシードを流し込むことで、前のテストが残したデータに結果が左右されなくなります。
具体例
同じ内容で何度実行しても結果が変わらないよう、upsert で書きます。
// prisma/seed.js
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const categories = [
{ id: 1, name: "書籍" },
{ id: 2, name: "文具" },
{ id: 3, name: "食品" },
];
for (const c of categories) {
await prisma.category.upsert({
where: { id: c.id },
update: { name: c.name }, // 既にあれば名前だけ更新
create: c, // 無ければ作る
});
}
await prisma.$disconnect();-- <a href="/glossary/sql" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">SQL</a> で書く場合も、重複実行で落ちない形にしておく
INSERT INTO categories (id, name) VALUES
(1, '書籍'), (2, '文具'), (3, '食品')
ON DUPLICATE KEY UPDATE name = VALUES(name);つまずきやすいところ
INSERT だけで書くと 2 回目で主キー重複エラーになります。upsert か、削除してから入れ直す形にしますexample.com のような予約済みドメインを使います覚え方
シードは「誰が何回流しても同じ状態になる初期データ」。この 2 条件を満たしていない時点で、シードではなく手作業の記録になっています。