DEV Community

Cover image for Mocking Your Postgres DB Doesn't Have to Suck
Sameer Saleem
Sameer Saleem

Posted on Edited on

Mocking Your Postgres DB Doesn't Have to Suck

We’ve all been there: you’re building a beautiful Express API, but your frontend looks like a ghost town because your database is empty. You spend 20 minutes manually typing test@test.com into TablePlus just to see if your CSS breaks.

Stop doing that.

By combining Faker.js with Prisma, we can create a "Reset Button" for our local environment that wipes the junk and seeds 100+ realistic records in seconds.


The Stack

  • Database: PostgreSQL
  • ORM: Prisma
  • Mocking: @faker-js/faker
  • Server: Express + TypeScript

1. Install the Secret Sauce

You don’t want Faker in your production bundle. Keep it in devDependencies.

npm install @faker-js/faker --save-dev

Enter fullscreen mode Exit fullscreen mode

2. The "Nuke & Pave" Script

Create a file at prisma/seed.ts. This script does two things: it cleans the database (to prevent unique constraint errors) and populates it.

import { PrismaClient } from '@prisma/client';
import { faker } from '@faker-js/faker';

const prisma = new PrismaClient();

async function main() {
  console.log("⚡ Starting database refresh...");

  // --- THE REMOVER ---
  // Note: Delete 'many' in order of dependency (Posts first, then Users)
  await prisma.post.deleteMany();
  await prisma.user.deleteMany();
  console.log("🧹 Database wiped.");

  // --- THE SEEDER ---
  const userCount = 10;

  for (let i = 0; i < userCount; i++) {
    await prisma.user.create({
      data: {
        email: faker.internet.email(),
        name: faker.person.fullName(),
        avatar: faker.image.avatar(),
        posts: {
          create: [
            { title: faker.lorem.sentence(), content: faker.lorem.paragraphs(2) },
            { title: faker.lorem.sentence(), content: faker.lorem.paragraphs(2) },
          ],
        },
      },
    });
  }

  console.log(`✅ Success! Seeded ${userCount} users with posts.`);
}

main()
  .catch((e) => { console.error(e); process.exit(1); })
  .finally(async () => { await prisma.$disconnect(); });

Enter fullscreen mode Exit fullscreen mode

3. Wire it into Package.json

Prisma has built-in support for seeding. Add this to your package.json so you can trigger the refresh with one command.

{
  "name": "my-express-api",
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  },
  "scripts": {
    "db:seed": "prisma db seed"
  }
}

Enter fullscreen mode Exit fullscreen mode

4. Why This Wins

  • Scalability Testing: Want to see how your Express middleware handles 5,000 users? Just change userCount to 5000 and run the script.
  • Zero Manual Entry: No more "asdfghjkl" names in your UI. You get real names, real emails, and real paragraphs.
  • Sanitizing Dev: Every time you run npm run db:seed, you start with a predictable, clean state.

The Result in Express

Now, when you hit your GET /users endpoint, your UI will actually look like a real product:

app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany({ include: { posts: true } });
  res.json(users); // Now returns a rich, realistic dataset!
});

Enter fullscreen mode Exit fullscreen mode

Wrap Up

Setting up a seeder takes 5 minutes, but it saves hours of manual data entry over the life of a project. It’s the difference between guessing if your UI works and knowing it does.

Happy hacking! 🚀


Top comments (0)