Facebook Pixel

Prisma là gì? Thư viện ORM cho Node.js và TypeScript

11 Oct, 2024

Tran Thuy Vy

Frontend Developer

Prisma là ORM cho Nodejs và TypeScript, tự động hóa việc ánh xạ các bảng trong cơ sở dữ liệu với các đối tượng (object) trong mã nguồn.

Prisma là gì? Thư viện ORM cho Node.js và TypeScript

Mục Lục

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.

orm là gì

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.

Typescript
// 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 NodejsTypeScript 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:

Typescript
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:

Bash
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:

Bash
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

Bash
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:

Bash
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:

Bash
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:

Prisma
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:

Bash
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:

Typescript
const newUser = await prisma.user.create({
  data: {
    name: 'Alice',
    email: 'alice@example.com',
  },
});
console.log(newUser);

Hoặc lấy tất cả posts:

Typescript
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:

Bash
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

Lập trình backend expressjs

xây dựng hệ thống microservices
  • Kiến trúc Hexagonal và ứng dụngal font-
  • TypeScript: OOP và nguyên lý SOLIDal font-
  • Event-Driven Architecture, Queue & PubSubal font-
  • Basic scalable System Designal font-

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab