Trong khi có nhiều cách tiếp cận để làm việc với cơ sở dữ liệu, Object-Relational Mapping (ORM) là một trong những lựa chọn phổ biến nhất. Một thư viện ORM cho phép bạn tương tác với cơ sở dữ liệu thông qua code thay vì phải viết trực tiếp các câu truy vấn SQL, giúp việc phát triển và bảo trì dễ dàng, nhanh chóng hơn.
Trong bài viết này, cùng mình đi khám phá về Prisma – một thư viện ORM, cũng như lý do tại sao Prisma đã và đang trở thành một trong những thư viện ORM phổ biến nhất hiện nay.
1. ORM là gì?
ORM (Object-Relational Mapping) là một kỹ thuật lập trình cho phép bạn ánh xạ các đối tượng trong mã nguồn của mình với các bảng trong cơ sở dữ liệu. Nghĩa là bạn có thể sử dụng các đối tượng và phương thức của ngôn ngữ lập trình thay vì viết câu truy vấn SQL thủ công.
Ví dụ cơ bản về cách sử dụng ORM trong Typescript với thư viện Sequelize để tương tác với cơ sở dữ liệu MySQL. Trong đó User ánh xạ trực tiếp tới bảng users trong cơ sở dữ liệu, mỗi thuộc tính tương ứng với một cột trong bảng.
// Import các module cần thiết
import { Sequelize, DataTypes, Model } from 'sequelize';
// Khởi tạo kết nối tới cơ sở dữ liệu MySQL
const sequelize = new Sequelize('database_name', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
});
// Định nghĩa lớp User ánh xạ tới bảng 'users' trong cơ sở dữ liệu
class User extends Model {
public id!: number;
public name!: string;
public email!: string;
}
User.init(
{
id: {
type: DataTypes.INTEGER.UNSIGNED,
autoIncrement: true,
primaryKey: true,
},
name: {
type: new DataTypes.STRING(128),
allowNull: false,
},
email: {
type: new DataTypes.STRING(128),
allowNull: false,
},
},
{
tableName: 'users', // Đảm bảo tên bảng là 'users'
sequelize,
}
);
async function main() {
try {
// Kết nối tới cơ sở dữ liệu
await sequelize.authenticate();
console.log('Kết nối thành công.');
// Đồng bộ hóa model với cơ sở dữ liệu (tạo bảng nếu chưa tồn tại)
await User.sync();
// Tạo một người dùng mới
const newUser = await User.create({ name: 'Nguyen Van A', email: 'nguyenvana@example.com' });
// Lấy tất cả người dùng từ bảng 'users'
const users = await User.findAll();
// In ra danh sách người dùng
console.log('Danh sách người dùng:');
users.forEach((user) => {
console.log(`ID: ${user.id}, Tên: ${user.name}, Email: ${user.email}`);
});
} catch (error) {
console.error('Không thể kết nối tới cơ sở dữ liệu:', error);
} finally {
// Đóng kết nối cơ sở dữ liệu
await sequelize.close();
}
}
main();
2. Prisma là gì?
Prisma là ORM cho Nodejs và TypeScript cho phép tạo ra một lớp trừu tượng (abstraction layer) giữa ứng dụng và cơ sở dữ liệu. Prisma cung cấp một API đơn giản và mạnh mẽ để thao tác với cơ sở dữ liệu mà không cần viết câu lệnh SQL.
Không giống như các ORM truyền thống, Prisma được thiết kế để làm việc với cả TypeScript và JavaScript, và nó tương thích với nhiều loại cơ sở dữ liệu phổ biến như: PostgreSQL, MySQL, SQLite, SQL Server, và MongoDB.
3. Các thành phần chính của Prisma
3.1 Prisma Client
Prisma Client là thư viện auto-generated giúp bạn tương tác với cơ sở dữ liệu thông qua các truy vấn TypeScript hoặc JavaScript. Các điểm mạnh đáng chú ý của Prisma Client:
- Type-safe: Bạn sẽ nhận được các gợi ý và kiểm tra kiểu dữ liệu trong khi viết mã, đảm bảo rằng các truy vấn cơ sở dữ liệu là an toàn.
- Auto-generated API: Prisma tự động tạo ra các phương thức để truy vấn, thêm, sửa, xóa dữ liệu dựa trên cấu trúc cơ sở dữ liệu mà bạn định nghĩa trong file
schema.prisma
.
Ví dụ về tạo người dùng mới với Prisma Client:
const newUser = await prisma.user.create({
data: {
name: 'John Doe',
email: 'john.doe@example.com',
},
});
3.2 Prisma Migrate
Prisma Migrate là một công cụ giúp bạn quản lý các migration trong cơ sở dữ liệu. Migration là quá trình áp dụng các thay đổi về cấu trúc cơ sở dữ liệu, chẳng hạn như thêm bảng mới, chỉnh sửa bảng hiện có, hoặc xóa bảng.
Các tính năng nổi bật của Prisma Migrate:
- Quản lý schema: bạn có thể thêm, sửa, xóa bảng hoặc các trường dữ liệu trong cơ sở dữ liệu của mình thông qua schema.prisma
- Migration: mỗi lần bạn thực hiện migration, Prisma sẽ tạo ra một bản ghi của migration, giúp bạn dễ dàng quản lý và quay lại các thay đổi nếu cần thiết.
- An toàn và dễ kiểm soát: trước khi áp dụng migration, Prisma cung cấp các bản xem trước và cho phép bạn kiểm tra lại để đảm bảo rằng không có vấn đề phát sinh.
Ví dụ sau khi thay đổi mô hình trong schema.prisma, bạn có thể tạo và áp dụng migration bằng lệnh:
npx prisma migrate dev --name "init_migration"
3.3 Prisma Studio
Prisma Studio là một giao diện đồ họa trực quan giúp bạn duyệt, thêm, sửa, và xóa dữ liệu trong cơ sở dữ liệu của mình một cách dễ dàng. Prisma Studio rất hữu ích khi bạn muốn tương tác trực tiếp với dữ liệu mà không cần phải viết mã hay thực hiện truy vấn SQL.
Các ưu điểm nổi bật:
- Giao diện trực quan: bạn có thể dễ dàng xem và chỉnh sửa dữ liệu ngay trong browser mà không cần phải cài đặt thêm bất kỳ công cụ khác.
- Dễ dàng thao tác dữ liệu: bạn có thể thêm bản ghi mới, chỉnh sửa dữ liệu hiện có, hoặc xóa dữ liệu chỉ với vài cú click chuột.
- Hiển thị mô hình dữ liệu: hiển thị tất cả các bảng và mối quan hệ giữa chúng, giúp bạn hiểu rõ hơn về cấu trúc cơ sở dữ liệu của mình.
Bạn có thể khởi chạy Prisma Studio bằng lệnh:
npx prisma studio
4. Ưu điểm của Prisma
- API của Prisma đơn giản và dễ hiểu, giúp người mới dễ dàng tiếp cận. Tự động hóa nhiều công việc tương tác với cơ sở dữ liệu, giảm thiểu rủi ro khi viết câu lệnh SQL thủ công.
- Prisma Client được auto-generated dựa trên file
schema.prisma
. - Prisma Migrate giúp bạn dễ dàng quản lý các thay đổi trong cơ sở dữ liệu.
- Prisma Studio cung cấp giao diện trực quan, bạn có thể thao tác dữ liệu mà không cần viết mã, tiết kiệm thời gian và công sức khi quản lý dữ liệu.
- Hỗ trợ nhiều loại cơ sở dữ liệu: PostgreSQL, MySQL, SQLite, MongoDB,...
5. Nhược điểm của Prisma
- Trong một số trường hợp phức tạp, khi cần các truy vấn SQL tối ưu và chi tiết, Prisma có thể không cung cấp đủ sự linh hoạt như viết SQL thuần.
- Đối với những dự án rất lớn hoặc phức tạp, kích thước của Prisma Client có thể tăng lên khá nhanh do auto-generated code. Điều này có thể làm cho dự án tải chậm hơn.
6. Hướng dẫn sử dụng Prisma trong dự án Typescript
Trước tiên, bạn cần có trong tay một project Typescript nha, nếu bạn chưa biết cách khởi tạo thì bạn có thể tham khảo tại đây.
Prisma hỗ trợ nhiều cơ sở dữ liệu, trong phần này mình lựa chọn MySQL nha.
B1: Cài đặt Prisma
npm install prisma --save-dev
npm install @prisma/client
B2: Sau khi cài đặt xong, khởi tạo Prisma bằng lệnh:
npx prisma init
Lệnh này sẽ tạo ra thư mục prisma/ chứa file schema.prisma để định nghĩa mô hình cơ sở dữ liệu của bạn.
B3: Thiết lập kết nối cơ sở dữ liệu
Mở file .env mà Prisma tạo ra và thêm thông tin kết nối cơ sở dữ liệu của bạn. Ví dụ, với MySQL:
DATABASE_URL="mysql://username:password@localhost:3306/db_name
- username: tên người dùng MySQL (ví dụ: root)
- password: mật khẩu của bạn cho tài khoản MySQL
- localhost: địa chỉ máy chủ MySQL (thường là localhost nếu cài đặt cục bộ)
- 3306: port mặc định của MySQL
- db_name: tên cơ sở dữ liệu mà bạn đã tạo
B4: Tiếp theo, định nghĩa mô hình dữ liệu của bạn trong file schema.prisma
. Ví dụ mình có 2 bảng cơ bản là User và Post như sau:
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
B5: Sau khi đã định nghĩa xong, bạn có thể chạy lệnh để migration tạo các bảng trong cơ sở dữ liệu:
npx prisma migrate dev --name init
Lệnh này sẽ thêm bảng User và Post vào cơ sở dữ liệu MySQL của bạn.
B6: Bây giờ thì bạn có thể sử dụng Prisma Client để tương tác với cơ sở dữ liệu MySQL của mình. Ví dụ, thêm một người dùng mới:
const newUser = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@example.com',
},
});
console.log(newUser);
Hoặc lấy tất cả posts:
const posts = await prisma.post.findMany({
where: {
published: true,
},
});
console.log(posts);
Nếu như bạn muốn sử dụng Prisma Studio để quản lý dữ liệu một cách trực quan, bạn có thể chạy lệnh:
npx prisma studio
7. Kết luận
Thông qua bài viết này, hy vọng bạn đã có cái nhìn tổng quan về Prisma, hiểu được cách thức Prisma vận hành và làm thế nào để sử dụng nó trong dự án Typescript thực tế.
Các bài viết liên quan:
Bài viết liên quan
MikroORM là gì? So sánh TypeORM, Sequelize, MikroORM và Prisma
Oct 26, 2024 • 10 min read
Tìm Hiểu Single Sign-On (SSO): Giải pháp đăng nhập một lần
Oct 26, 2024 • 11 min read
Giới thiệu FFmpeg: Hướng dẫn Encode Video và Streaming với HLS
Oct 25, 2024 • 14 min read
SQL Injection là gì? Những cách phòng ngừa SQL Injection
Oct 25, 2024 • 10 min read
So sánh hiệu suất Query của PostgreSQL và MySQL
Oct 24, 2024 • 9 min read
Fastify là gì? So sánh hiệu suất của Fastify và ExpressJS
Oct 22, 2024 • 12 min read