Db seed generator
Reusable skills and intelligent agents for Claude Code. Production-grade, self-verifying, configurable.
npx -y skills add Nembie/claude-code-skills --skill db-seed-generatorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generate realistic database seed data from a Prisma schema. Use when asked to generate seed data, create test data, populate the database, seed the DB, or create fixtures.
SKILL.md
4.6 KB, as published. Nobody here has run it
DB Seed Generator
Before generating any output, read config/defaults.md and adapt all patterns, imports, and code examples to the user's configured stack.
Process
- Read
schema.prismaand extract all models, fields, types, constraints, relations, and enums. - Determine dependency order: models with no required relations first, then models that depend on them.
- Generate a
prisma/seed.tsfile with realistic fake data that respects all constraints. - Output a ready-to-run seed file.
Dependency Ordering
Build a directed graph of model dependencies from @relation fields. Topologically sort so parent records are created before children.
User (no deps) → create first
Organization (no deps) → create first
Post (depends on User) → create second
Comment (depends on User, Post) → create third
If circular dependencies exist, use a two-pass approach: create records with required fields first, then update with optional relation fields.
Data Generation Rules
Field Name Conventions
Generate realistic values based on field names:
| Pattern | Generated value |
|---|---|
firstName | "Elena", "Marcus", "Priya" |
lastName | "Rodriguez", "Chen", "Okafor" |
name (on User) | "Elena Rodriguez" |
email | "[email protected]" |
phone | "555-0101", "555-0102" |
avatarUrl, imageUrl | "https://example.com/avatars/1.jpg" |
url, website | "https://example.com" |
title (on Post/Article) | Realistic short sentences |
content, body, description | 1-3 realistic sentences |
slug | Derived from title: "realistic-short-sentence" |
price, amount | Realistic numbers like 29.99, 149.00 |
quantity, count | Small integers: 1-100 |
createdAt, updatedAt | Dates spread over the last 90 days |
publishedAt | Either null or a date after createdAt |
isActive, isPublished | Mix of true/false |
role (enum) | Distribute across valid enum values |
password | Pre-hashed placeholder: "$2b$10$..." — never plaintext |
Constraints
@unique: Ensure every value is unique. Use index suffixes:"[email protected]","[email protected]".@id @default(cuid()): Omit from create calls — let the database generate them.@default(now()): Omit or set explicit dates for predictable ordering.@default(value): Omit to use the default, or set explicitly for variety.- Enums: Only use values defined in the enum.
Int,Float: Respect@db.SmallInt,@db.Decimal(10,2)etc.
Relations
- One-to-many: Create the "one" side first, reference its ID on the "many" side.
- Many-to-many (implicit): Use
connectsyntax after both sides exist. - Self-referencing: Create root records first (no parent), then children pointing to them.
- Required relations: Always satisfy — never leave a required FK null.
- Optional relations: Mix of connected and null.
Output Template
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
// Clear existing data (reverse dependency order)
await prisma.comment.deleteMany();
await prisma.post.deleteMany();
await prisma.user.deleteMany();
// Seed in dependency order
const users = await Promise.all([
prisma.user.upsert({
where: { email: "[email protected]" },
update: {},
create: {
email: "[email protected]",
name: "Elena Rodriguez",
// ... fields
},
}),
// ... more users
]);
// Use createMany for bulk inserts where relations allow
await prisma.post.createMany({
data: [
{ title: "...", authorId: users[0].id },
// ...
],
});
console.log("Seeded: X users, Y posts, Z comments");
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(() => prisma.$disconnect());
Scale Parameter
When the user specifies a count (e.g., "seed 50 users"), generate that many records. Default to 5-10 records per model. Use createMany for bulk inserts where possible. Wrap large seeds in a prisma.$transaction().
Upsert Pattern
Use upsert on a unique field to make the seed idempotent — safe to run multiple times.
Reference
See references/seed-patterns.md for dependency ordering details, realistic data patterns, and performance tips.