SQL
Để làm việc với cơ sở dữ liệu quan hệ (SQL như MySQL, PostgreSQL, SQL Server) trong Node.js, bạn có hai trường phái tiếp cận chính: Sử dụng Query Builder / Driver thuần (viết câu lệnh SQL dạng chuỗi) hoặc sử dụng ORM (thao tác qua đối tượng JavaScript, tương tự như Mongoose bên MongoDB) […]
Để làm việc với cơ sở dữ liệu quan hệ (SQL như MySQL, PostgreSQL, SQL Server) trong Node.js, bạn có hai trường phái tiếp cận chính: Sử dụng Query Builder / Driver thuần (viết câu lệnh SQL dạng chuỗi) hoặc sử dụng ORM (thao tác qua đối tượng JavaScript, tương tự như Mongoose bên MongoDB) [shopping].
Bài viết này sẽ hướng dẫn bạn cách kết nối và thao tác SQL bằng MySQL2 (Driver thuần phổ biến nhất) và giới thiệu Sequelize (ORM chuẩn mực cho SQL trong Node.js) [shopping].
Sử dụng Driver thuần (mysql2)
Cách này phù hợp khi bạn đã giỏi SQL thuần và muốn tối ưu tốc độ truy vấn cao nhất.
Bước 1: Cài đặt thư viện
npm install express mysql2
Bước 2: Kết nối và viết API bằng SQL thuần
Lập trình viên thực tế luôn sử dụng Connection Pool (Hồ chứa kết nối) để tái sử dụng các kết nối, tránh việc tạo mới liên tục làm sập server database.
const express = require('express');
const mysql = require('mysql2/promise'); // Sử dụng bản promise để dùng được async/await
const app = express();
app.use(express.json());
// Tạo Pool kết nối đến MySQL
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'my_company_db',
waitForConnections: true,
connectionLimit: 10, // Tối đa 10 kết nối đồng thời
queueLimit: 0
});
// 1. READ: Lấy danh sách nhân viên
app.get('/employees', async (req, res) => {
try {
// Thực thi câu lệnh SQL thuần
const [rows] = await pool.query('SELECT * FROM employees');
res.json(rows);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 2. CREATE: Thêm nhân viên mới (Chống tấn công SQL Injection)
app.post('/employees', async (req, res) => {
try {
const { name, position, salary } = req.body;
// Sử dụng dấu hỏi chấm (?) làm placeholder để bảo mật dữ liệu đầu vào
const sql = 'INSERT INTO employees (name, position, salary) VALUES (?, ?, ?)';
const [result] = await pool.query(sql, [name, position, salary]);
res.status(201).json({ message: 'Thêm thành công!', insertId: result.insertId });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000, () => console.log('Server SQL running on port 3000'));
Sử dụng ORM (Sequelize)
Nếu bạn vừa chuyển từ Mongoose (MongoDB) sang, hoặc muốn code sạch sẽ mà không cần viết các chuỗi lệnh SELECT, INSERT dài dòng, Sequelize là lựa chọn hàng đầu.
Bước 1: Cài đặt Sequelize và Driver tương ứng
npm install sequelize mysql2
Bước 2: Cấu hình và Định nghĩa Model
Sequelize sẽ tự động tạo bảng trong Database nếu bảng đó chưa tồn tại (tính năng Sync).
const { Sequelize, DataTypes } = require('sequelize');
// Khởi tạo thực thể kết nối
const sequelize = new Sequelize('my_company_db', 'root', 'your_password', {
host: 'localhost',
dialect: 'mysql', // Có thể đổi thành 'postgres', 'sqlite', 'mssql'
logging: false // Tắt log các câu lệnh SQL thô ra console
});
// Định nghĩa cấu trúc bảng Product (tương đương Schema trong Mongoose)
const Product = sequelize.define('Product', {
title: {
type: DataTypes.STRING,
allowNull: false // Bắt buộc nhập (NOT NULL)
},
price: {
type: DataTypes.DECIMAL(10, 2),
defaultValue: 0.00
}
}, {
timestamps: true // Tự động tạo trường createdAt và updatedAt
});
// Đồng bộ hóa cấu trúc code với Database thực tế
sequelize.sync()
.then(() => console.log('🎉 Đồng bộ database SQL thành công!'))
.catch(err => console.error('❌ Lỗi đồng bộ:', err));
Sự khác biệt cốt lõi giữa NoSQL (MongoDB) và SQL trong Node.js
| Tiêu chí | Mongoose (MongoDB) | Sequelize (MySQL / PostgreSQL) |
| Bản chất dữ liệu | Không ràng buộc, dạng cây lồng nhau (BSON/JSON) [shopping]. | Ràng buộc chặt chẽ, chia thành các hàng và cột. |
| Liên kết bảng | Sử dụng .populate() (Dựa trên ID tham chiếu) [shopping]. | Sử dụng JOIN chính hiệu (belongsTo, hasMany) [shopping]. |
| Thay đổi cấu trúc | Chỉ cần sửa file Code Schema là xong. | Phải chạy Migration để cập nhật cấu trúc bảng dưới DB. |