Quá trình phát triển ứng dụng, việc tương tác với database là một phần quan trọng. Các ORM (Object-Relational Mapping) ra đời nhằm giúp các developer dễ dàng làm việc với cơ sở dữ liệu mà không cần phải viết nhiều câu lệnh SQL phức tạp.
Sequelize là một trong những thư viện ORM mạnh mẽ dành cho Nodejs, giúp kết nối và quản lý cơ sở dữ liệu cách hiệu quả. Trong bài viết này, cùng mình đi tìm hiểu chi tiết về Sequelize. Bên cạnh đó, mình cũng sẽ hướng dẫn các bạn cách cài đặt và sử dụng Sequelize với TypeScript trong dự án.
1. Sequelize là gì?
Sequelize là một ORM (Object Relational Mapping) dành cho Nodejs và TypeScript, giúp Developer tương tác với cơ sở dữ liệu SQL một cách dễ dàng thông qua các phương thức JavaScript mà không cần viết câu lệnh SQL thuần. Sequelize hỗ trợ các cơ sở dữ liệu phổ biến như: Oracle, PostgresSQL, MySQL, MariaDB, SQLite, và SQL Server.
Sequelize cung cấp các tính năng mạnh mẽ như quản lý transactions, hỗ trợ quan hệ giữa table, cơ chế lazy loading và eager loading, cũng như khả năng read replication.
Nhờ thế, sequelize giúp bạn dễ dàng thao tác với cơ sở dữ liệu thông qua JavaScript, giảm thiểu việc viết SQL thuần và tối ưu hóa hiệu suất cho ứng dụng.
2. Tại sao nên sử dụng Sequelize?
- Sequelize cung cấp API giúp bạn có thể thực hiện các thao tác CRUD (Create, Read, Update, Delete) mà không cần phải viết lệnh SQL thuần.
- Như mình đã đề cập trên định nghĩa, Sequelize tương thích với các cơ sở dữ liệu phổ biến như: MySQL, PostgreSQL, SQLite và SQL Server.
- Sequelize có thể tích hợp tốt với TypeScript, giúp bạn tận dụng toàn bộ lợi ích của type system của TypeScript, như tự động gợi ý code và kiểm tra kiểu tĩnh.
- Sequelize cho phép bạn dễ dàng định nghĩa các quan hệ giữa các bảng như: one-to-one, one-to-many, và many-to-many
- Bạn có thể dễ dàng quản lý sự thay đổi của cấu trúc cơ sở dữ liệu thông qua hệ thống migrations mà Sequelize cung cấp.
Bên cạnh đó, Sequelize còn có nhiều tính năng nâng cao giúp tối ưu quá trình làm việc với cơ sở dữ liệu:
- Sequelize hỗ trợ quản lý transactions hiệu quả, đảm bảo các thay đổi được thực hiện hoặc hoàn tác một cách nhất quán.
- Bạn có thể lựa chọn cách load data tối ưu với các cơ chế lazy loading và eager loading để tăng hiệu suất khi làm việc với các quan hệ giữa bảng.
- Sequelize cho phép bạn sử dụng hooks để can thiệp vào quá trình trước và sau khi thao tác dữ liệu, chẳng hạn như kiểm tra hợp lệ.
3. Nhược điểm của Sequelize?
- Khi cần tối ưu hóa truy vấn cho những trường hợp đặc biệt hoặc truy vấn phức tạp, bạn có thể gặp khó khăn hơn so với việc viết câu lệnh SQL thuần.
- Vì Sequelize là một ORM đầy đủ tính năng, nó có thể chiếm dụng nhiều bộ nhớ hơn so với việc trực tiếp làm việc với lệnh SQL.
4. So sánh giữa Sequelize và Prisma
Sequelize | Prisma | |
---|---|---|
Ngôn ngữ hỗ trợ | JavaScript, TypeScript | TypeScript, JavaScript |
Cơ sở dữ liệu hỗ trợ | MySQL, PostgreSQL, SQLite, SQL Server, MariaDB | MySQL, PostgreSQL, SQLite, MongoDB |
Hỗ trợ schema tự động | Không có, cần tạo thủ công models cho từng bảng. | Có hỗ trợ, tự động generate schema dựa trên cơ sở dữ liệu. |
Kiến trúc và Thiết Kế | ORM truyền thống, tập trung vào việc tạo các model OOP để tương tác với cơ sở dữ liệu. | Data-centric, tập trung vào quản lý dữ liệu và schema-first, tự động generate code dựa trên schema. |
Mức độ dễ sử dụng | Dễ học, cú pháp gần gũi với SQL. | Rất dễ sử dụng nhờ Prisma Client, nhưng yêu cầu hiểu biết về schema-first. |
Quan hệ giữa các bảng | One-to-One, One-to-Many, Many-to-Many | One-to-One, One-to-Many, Many-to-Many |
Query | Sử dụng phương thức ORM, câu lệnh trực tiếp tương tự như SQL | Sử dụng Prisma Client với cú pháp trực quan |
Hiệu suất | Tốt, nhưng phụ thuộc vào cấu trúc truy vấn và cơ sở dữ liệu | Có tính năng tối ưu truy vấn |
Tính năng bổ sung | Lazy loading, Eager loading, Read replication | Tự động generate code dựa trên schema, quản lý kiểu dữ liệu tốt hơn |
Tính mở rộng và quản lý dự án lớn | Khả năng mở rộng tốt, nhưng có thể phức tạp với các dự án lớn và nhiều truy vấn phức tạp. | Rất phù hợp cho các dự án lớn, tối ưu truy vấn và quản lý schema tự động. |
5. Hướng dẫn sử dụng Sequelize trong dự án TypeScript
Trước khi đi vào cài đặt, bạn cần có một dự án TypeScript cơ bản. Nếu bạn chưa biết cách cũng đừng quá lo lắng bạn có thể tham khảo tại đây.
Sau khi đã sẵn sàng, cùng mình cài đặt Sequelize vào dự án nhé.
B1: Cài đặt Sequelize và driver cho cơ sở dữ liệu bạn muốn sử dụng. Ví dụ như bạn muốn sử dụng MySQL, hãy cài đặt Sequelize và driver MySQL.
npm install sequelize mysql2
Bên cạnh đó, bạn cần cài đặt thêm type của sequelize để TypeScript hiểu nhé.
npm install typescript @types/sequelize --save-dev
B2: Cấu hình kết nối với cơ sở dữ liệu. Mình sẽ tạo một file database.ts
để quản lý việc kết nối.
import { Sequelize } from 'sequelize';
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql', // hoặc 'postgres', 'sqlite', 'mssql' tuỳ theo cơ sở dữ liệu bạn sử dụng
});
export default sequelize;
B3: Định nghĩa model
Trong Sequelize, mỗi table trong databas được ánh xạ đến một module. Mình sẽ tạo User module để đại diện cho bảng users trong database:
import { Model, DataTypes } from 'sequelize';
import sequelize from './database';
class User extends Model {
public id!: number;
public name!: string;
public email!: string;
public readonly createdAt!: Date;
public readonly updatedAt!: Date;
}
User.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
},
{
sequelize,
modelName: 'User',
tableName: 'users',
}
);
export default User;
B4: Sau khi định nghĩa module, bạn có thể dễ dàng thực hiện các thao tác CRUD với database. Mình sẽ ví dụ cách thêm người dùng mới vào bảng users nha
import User from './user';
const createUser = async () => {
const newUser = await User.create({
name: 'John Doe',
email: 'johndoe@example.com',
});
console.log(newUser);
};
createUser();
Hay là lấy danh sách tất cả người dùng, update và xoá user
const getAllUsers = async () => {
const users = await User.findAll();
console.log(users);
};
const updateUser = async (id: number) => {
const user = await User.findByPk(id);
if (user) {
user.name = 'Updated Name';
await user.save();
}
};
const deleteUser = async (id: number) => {
const user = await User.findByPk(id);
if (user) {
await user.destroy();
}
};
Bên cạnh đó, bạn cũng có thể định nghĩa quan hệ 1-nhiều (One-to-Many) giữa bảng User và bảng Post như thế này:
import { Model, DataTypes } from 'sequelize';
import sequelize from './database';
import User from './user';
class Post extends Model {
public id!: number;
public title!: string;
public content!: string;
public userId!: number;
}
Post.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
content: {
type: DataTypes.TEXT,
allowNull: false,
},
userId: {
type: DataTypes.INTEGER,
allowNull: false,
},
},
{
sequelize,
modelName: 'Post',
tableName: 'posts',
}
);
User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });
export default Post;
6. Kết luận
Hy vọng qua bài viết này, bạn đã nắm được cách sử dụng Sequelize từ việc cài đặt đến cấu hình và thao tác với cơ sở dữ liệu trong dự án. Nếu bạn đang làm việc với cơ sở dữ liệu trong các dự án Nodejs, Sequelize chắc chắn là một công cụ đáng để bạn cân nhắc sử dụng.
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