在后端开发中,关系型数据库依然占据着重要地位。MySQL 和 PostgreSQL 是最常用的两种关系型数据库,前者轻量易用,后者功能强大、规范严格。Node.js 通过成熟的数据库驱动与 ORM 工具,可以高效地与这两种数据库进行交互。本文将从基础连接开始,逐步讲解在 Node.js 中操作 MySQL 与 PostgreSQL 的常见方式与最佳实践。
一、为什么在 Node.js 中使用关系型数据库
关系型数据库在以下场景中仍然非常适合:
- 数据结构稳定、字段明确
- 需要复杂查询与多表关联
- 对事务一致性要求较高
- 金融、订单、账务等核心业务
Node.js 的异步 I/O 模型可以很好地应对数据库访问延迟,与 MySQL、PostgreSQL 配合使用非常成熟。
二、MySQL 与 PostgreSQL 的差异简述
在选择数据库之前,理解它们的特点非常重要:
- MySQL:部署简单、生态成熟、性能优秀,适合大多数 Web 应用
- PostgreSQL:支持更多 SQL 标准,事务和扩展能力更强,适合复杂业务
在 Node.js 层面,两者的使用方式非常相似。
三、Node.js 操作 MySQL
1. 安装 MySQL 驱动
Node.js 中最常用的 MySQL 驱动是 mysql2。
bash
npm install mysql2
2. 创建数据库连接
js
const mysql = require("mysql2/promise");
const pool = mysql.createPool({
host: "localhost",
user: "root",
password: "password",
database: "node_demo",
waitForConnections: true,
connectionLimit: 10
});
使用连接池可以避免频繁创建和关闭连接,提高性能。
3. 执行查询
js
const [rows] = await pool.query(
"SELECT id, username FROM users WHERE age > ?",
[18]
);
console.log(rows);
使用占位符可以有效防止 SQL 注入。
4. 插入与更新数据
js
await pool.execute(
"INSERT INTO users (username, age) VALUES (?, ?)",
["tom", 25]
);
await pool.execute(
"UPDATE users SET age = ? WHERE username = ?",
[26, "tom"]
);
四、Node.js 操作 PostgreSQL
1. 安装 PostgreSQL 驱动
bash
npm install pg
2. 创建连接池
js
const { Pool } = require("pg");
const pool = new Pool({
host: "localhost",
user: "postgres",
password: "password",
database: "node_demo",
max: 10
});
3. 查询数据
js
const result = await pool.query(
"SELECT id, username FROM users WHERE age > $1",
[18]
);
console.log(result.rows);
PostgreSQL 使用 $1、$2 作为参数占位符。
4. 插入与删除数据
js
await pool.query(
"INSERT INTO users (username, age) VALUES ($1, $2)",
["alice", 22]
);
await pool.query(
"DELETE FROM users WHERE username = $1",
["alice"]
);
五、事务处理
在涉及多步操作时,事务尤为重要。
MySQL 示例
js
const conn = await pool.getConnection();
try {
await conn.beginTransaction();
await conn.query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
await conn.query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
await conn.commit();
} catch (err) {
await conn.rollback();
} finally {
conn.release();
}
PostgreSQL 示例
js
const client = await pool.connect();
try {
await client.query("BEGIN");
await client.query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
await client.query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
await client.query("COMMIT");
} catch (err) {
await client.query("ROLLBACK");
} finally {
client.release();
}
事务是保证数据一致性的关键手段。
六、使用 ORM 简化数据库操作
在实际项目中,通常会使用 ORM 框架,如:
- Sequelize
- TypeORM
- Prisma
ORM 的优势在于:
- 使用对象操作数据库
- 跨数据库支持
- 自动生成 SQL
- 更清晰的代码结构
但同时也需要注意 ORM 带来的性能开销。
七、数据库操作的最佳实践
在 Node.js 项目中操作关系型数据库时,建议遵循以下原则:
- 始终使用连接池
- 使用参数化查询,防止 SQL 注入
- 控制单次查询的数据量
- 合理使用事务
- 为高频查询建立索引
- 捕获并记录数据库错误
这些实践能显著提高系统稳定性。
八、总结
通过本文,你已经掌握:
- Node.js 操作 MySQL 与 PostgreSQL 的基本方式
- 使用连接池提升性能
- 常见的 CRUD 操作与事务处理
- MySQL 与 PostgreSQL 的差异
- 实际项目中的数据库使用建议
MySQL 与 PostgreSQL 仍然是 Node.js 后端开发的重要基石。熟练掌握它们的使用方式,可以让你在面对复杂业务场景时更加从容。