Giới thiệu
Khi chuyển từ Ruby on Rails hoặc Elixir Phoenix sang NestJS + Prisma, bạn có thể cảm thấy thiếu thốn một công cụ tương tác với cơ sở dữ liệu. Bài viết này sẽ hướng dẫn bạn cách xây dựng một REPL (Read-Eval-Print Loop) cho NestJS và Prisma, giúp bạn dễ dàng tương tác với cơ sở dữ liệu của mình.
Vấn đề: Thiếu Console Tương Tác 😢
Nếu bạn đã từng làm việc với Rails hoặc Phoenix, bạn sẽ hiểu cảm giác tuyệt vời khi có một console tương tác trong tay:
# Rails
rails console
> User.where(active: true).count
=> 1337
# Phoenix
iex -S mix
> MyApp.Repo.all(User)
Những REPL này thực sự là cách mạng trong quá trình phát triển. Bạn có thể:
- Kiểm tra nhanh một truy vấn
- Khám phá mô hình dữ liệu của bạn
- Gỡ lỗi một mối quan hệ phức tạp
Nhưng khi tôi chuyển sang NestJS + Prisma... 🤷♂️
Mặc dù có prisma studio
cho giao diện người dùng, đôi khi bạn chỉ muốn lập trình để tương tác với dữ liệu. Bạn muốn:
- Nhanh chóng tạo mẫu các truy vấn phức tạp
- Kiểm tra các trường hợp đặc biệt mà không cần viết đầy đủ file test
- Khám phá mối quan hệ dữ liệu một cách tương tác
- Gỡ lỗi các vấn đề dữ liệu sản xuất bằng các truy vấn thực sự
Giải pháp: Tự xây dựng Console Cơ Sở Dữ Liệu 🛠️
Vậy tôi đã xây dựng một REPL riêng cho mình (với sự trợ giúp của AI Claude Sonnet)! Giới thiệu Prisma DB Console - một REPL tương tác giống như Rails cho Prisma:
typescript
#!/usr/bin/env ts-node
import { PrismaClient } from '@prisma/client';
import repl from 'repl';
import util from 'util';
// Khởi tạo Prisma với logging truy vấn
const prisma = new PrismaClient({
log: [
{ emit: 'event', level: 'query' },
{ emit: 'stdout', level: 'error' },
{ emit: 'stdout', level: 'info' },
{ emit: 'stdout', level: 'warn' },
],
});
// Log SQL truy vấn với params và thời gian thực hiện
prisma.$on('query', (e) => {
console.log('---');
console.log(e.query);
console.log(e.params);
console.log(String(e.duration) + 'ms');
console.log('---');
});
Tính Năng Nổi Bật ✨
1. Khách Hàng Prisma Được Tải Trước
Không cần phải import boilerplate - chỉ cần bắt đầu truy vấn:
typescript
db-console> await prisma.user.findMany()
db-console> await prisma.organization.count()
2. Khả Năng Thấy Truy Vấn SQL
Xem chính xác SQL được tạo ra, với các tham số và thời gian thực hiện:
---
SELECT "User"."id", "User"."email" FROM "User"
[]
12ms
---
3. Ví Dụ Hữu Ích Khi Khởi Động
Bởi vì ai nhớ hết cú pháp của Prisma?
🚀 Prisma DB Console
📊 Khách hàng Prisma đã được tải với tên "prisma"
💡 Ví dụ:
await prisma.user.findMany()
await prisma.tenant.count()
await prisma.$queryRaw`SELECT COUNT(*) FROM "user"`
await prisma.organization.findFirst({ include: { tenants: true } })
4. Xử Lý Thoát Sạch
Tự động ngắt kết nối với cơ sở dữ liệu khi bạn thoát:
typescript
function cleanupAndExit() {
console.log('\n👋 Ngắt kết nối với cơ sở dữ liệu...');
prisma.$disconnect()
.finally(() => process.exit(0));
}
Cách Sử Dụng: Đơn Giản Như npm run db:console
🚀
Đã thêm vào như một script npm để dễ dàng truy cập:
json
{
"scripts": {
"db:console": "ts-node bin/db-console.ts"
}
}
Giờ đây tôi có thể chỉ cần chạy:
npm run db:console
# hoặc
pnpm db:console
Tác Động Thực Tế 📈
Thay vì:
- Viết một script tạm thời
- Thêm console.logs
- Chạy script
- Xóa script
- Lặp lại...
Tôi chỉ cần:
- Mở console
- Thử nghiệm
- Xong!
Muốn Tự Xây Dựng? 🔨
Toàn bộ mã nguồn chỉ khoảng 70 dòng TypeScript. Các thành phần chính:
- Module
repl
tích hợp sẵn của Node - Khách hàng Prisma của bạn
- Logging truy vấn dựa trên sự kiện
- Xử lý cleanup đúng cách
- Một số tiện ích hữu ích trong ngữ cảnh REPL
Lời Kết 💭
Đôi khi các công cụ tốt nhất là những gì bạn tự xây dựng. Chúng phù hợp với quy trình làm việc của bạn, giải quyết các vấn đề cụ thể của bạn và mang đến trải nghiệm phát triển giống như Rails mà bạn đã bỏ lỡ.
Nếu bạn đang làm việc với NestJS + Prisma và thường xuyên viết các script tạm thời để kiểm tra các truy vấn cơ sở dữ liệu, hãy xem xét việc xây dựng console cho riêng mình. Tương lai của bạn sẽ biết ơn bạn!
Câu Hỏi Thường Gặp (FAQ)
1. Làm thế nào để tôi có thể cài đặt Prisma DB Console?
- Bạn chỉ cần sao chép mã nguồn và thêm vào dự án NestJS của mình.
2. Có cần cài đặt thêm thư viện nào không?
- Không, bạn không cần cài thêm thư viện nào ngoài Prisma và các thư viện có sẵn trong dự án của bạn.
3. Tôi có thể sử dụng công cụ này cho các dự án khác không?
- Có, bạn có thể áp dụng tương tự cho các dự án sử dụng Prisma khác.