TL;DR: Coming from Rails/Phoenix, I missed having an interactive database console. So I built one for my NestJS + Prisma stack. Here's how and why.
The Problem: No Interactive Database Console ๐ข
If you've ever worked with Ruby on Rails or Elixir Phoenix, you know the joy of having an interactive console at your fingertips:
# Rails
rails console
> User.where(active: true).count
=> 1337
# Phoenix
iex -S mix
> MyApp.Repo.all(User)
These REPLs are game-changers for development. Need to quickly test a query? Explore your data model? Debug a complex association? Just fire up the console and start experimenting.
But when I switched to NestJS + Prisma... ๐คทโโ๏ธ
Sure, there's prisma studio
for a GUI, but sometimes you just want to code your way through the data. You want to:
- Quickly prototype complex queries
- Test edge cases without writing full test files
- Explore data relationships interactively
- Debug production data issues with real queries
The Solution: DIY Database Console ๐ ๏ธ
So I built my own (of course with a lot AI assistance by Claude Sonnet)! Meet the Prisma DB Console - a Rails-like interactive REPL for Prisma:
#!/usr/bin/env ts-node
import { PrismaClient } from '@prisma/client';
import repl from 'repl';
import util from 'util';
// Initialize Prisma with query logging
const prisma = new PrismaClient({
log: [
{ emit: 'event', level: 'query' },
{ emit: 'stdout', level: 'error' },
{ emit: 'stdout', level: 'info' },
{ emit: 'stdout', level: 'warn' },
],
});
// Log SQL queries with params and timing
prisma.$on('query', (e) => {
console.log('---');
console.log(e.query);
console.log(e.params);
console.log(String(e.duration) + 'ms');
console.log('---');
});
Key Features That Make It Awesome โจ
1. Prisma Client Pre-loaded
No more import boilerplate - just start querying:
db-console> await prisma.user.findMany()
db-console> await prisma.organization.count()
2. SQL Query Visibility
See exactly what SQL gets generated, with parameters and execution time:
---
SELECT "User"."id", "User"."email" FROM "User"
[]
12ms
---
3. Helpful Examples on Startup
Because who remembers all the Prisma syntax?
๐ Prisma DB Console
๐ Prisma Client loaded as "prisma"
๐ก Examples:
await prisma.user.findMany()
await prisma.tenant.count()
await prisma.$queryRaw`SELECT COUNT(*) FROM "user"`
await prisma.organization.findFirst({ include: { tenants: true } })
4. Clean Exit Handling
Properly disconnects from the database when you exit:
function cleanupAndExit() {
console.log('\n๐ Disconnecting from database...');
prisma.$disconnect()
.finally(() => process.exit(0));
}
Usage: Simple as npm run db:console
๐
Added it as an npm script for easy access:
{
"scripts": {
"db:console": "ts-node bin/db-console.ts"
}
}
Now I can just run:
npm run db:console
# or
pnpm db:console
And I'm off to the races! Perfect for:
-
Data exploration:
await prisma.user.findMany({ include: { profile: true } })
-
Quick counts:
await prisma.order.count({ where: { status: 'PENDING' } })
-
Complex queries:
await prisma.$queryRaw\
SELECT * FROM ...`` - Testing relationships: Verify those Prisma relations work as expected
The Real Impact ๐
Instead of:
- Writing a throwaway script
- Adding console.logs
- Running the script
- Deleting the script
- Repeat...
I just:
- Open console
- Experiment
- Done!
Want to Build Your Own? ๐จ
The full implementation is about 70 lines of TypeScript. Key ingredients:
- Node's built-in
repl
module - Your Prisma client
- Event-based query logging
- Proper cleanup handlers
- Some helpful utilities in the REPL context
The beauty is in its simplicity - no external dependencies beyond what you already have in a NestJS + Prisma project. The full code of my db-console.ts
is available on GitHub Gist if you want to copy and adapt it.
Closing Thoughts ๐ญ
Sometimes the best tools are the ones you build yourself. They fit your exact workflow, solve your specific pain points, and give you that Rails-like developer experience you've been missing.
If you're working with NestJS + Prisma and find yourself constantly writing throwaway scripts to test database queries, consider building your own console. Your future self will thank you!
What is your experience in the NestJS + Prisma ecosystem? Did I miss out on an existing solution? Just drop a comment below!
Top comments (0)