Seeding Database Data

1. Creating Seed Script

// prisma/seed.ts
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();

async function main() {
  await prisma.user.upsert({
    where: { email: "admin@example.com" },
    update: {},
    create: { email: "admin@example.com", role: "ADMIN" }
  });
}
main().finally(() => prisma.$disconnect());
AspectDetail
IdempotentUse upsert / skipDuplicates
OrderParents before children

2. Configuring Seed Command

{
  "prisma": { "seed": "tsx prisma/seed.ts" }
}
RunnerUse
tsxFast TypeScript runner
ts-nodeMature
nodeFor compiled JS

3. Running Seed Command

CommandDetail
prisma db seedManual execution
migrate resetAuto-runs seed
migrate devRuns seed on first migration of empty DB

4. Using Faker for Test Data

import { faker } from "@faker-js/faker";
const users = Array.from({ length: 50 }, () => ({
  email: faker.internet.email(),
  name:  faker.person.fullName()
}));
await prisma.user.createMany({ data: users });
HelperUse
internet.emailRandom emails
person.*Names
faker.seed(n)Reproducible runs

5. Implementing Idempotent Seeds

StrategyDetail
upsert by uniqueSafe re-run
createMany + skipDuplicatesBulk idempotency
await prisma.user.create({
  data: {
    email: "demo@x.io",
    posts: { create: [{ title: "Welcome" }, { title: "Hello" }] }
  }
});
PatternDetail
Nested createOne round-trip
Connect existingReuse seeded references

7. Importing from CSV Files

import { parse } from "csv-parse/sync";
import { readFileSync } from "node:fs";
const rows = parse(readFileSync("data/users.csv"), { columns: true });
await prisma.user.createMany({ data: rows, skipDuplicates: true });
StepDetail
Parsecsv-parse / papaparse
ValidateZod schema per row
Bulk insertcreateMany in batches

8. Creating Factory Functions

const userFactory = (overrides = {}) => ({
  email: faker.internet.email(),
  role: "USER",
  ...overrides
});
BenefitDetail
ReuseTests + seeds share factories
OverrideSpread overrides for variants

9. Handling Large Data Batches

TipDetail
Chunk inserts1k-10k per batch
Disable triggersIf safe, for speed
COPY (PG)Use raw SQL for millions of rows

10. Resetting and Reseeding Database

CommandEffect
migrate resetDrop, recreate, migrate, seed
migrate reset --skip-seedNo seeding