Node.js ORM 实现增删查改

Linux 下安装 MongoDB/MySQL/SQLite 并通过 Node.js ORM 实现增删查改

你需要在 Linux 系统中安装 MongoDB、MySQL、SQLite,并使用 JavaScript(Node.js 生态) 的主流 ORM 框架实现三大数据库的连接与增删查改(CRUD)。本文以 Ubuntu 22.04 为例(附 CentOS 适配),选择 JS 生态最成熟的 ORM:

  • MySQL/SQLite(关系型数据库):使用 Sequelize(Node.js 最主流的通用关系型 ORM);
  • MongoDB(文档型数据库):使用 Mongoose(MongoDB 专属 ODM/ORM,JS 生态事实标准)。

一、环境准备:Linux 安装三大数据库

1. 系统基础配置(通用步骤)

1
2
3
4
5
# Ubuntu/Debian 更新源
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL 替换为:
# sudo yum update -y

2. 安装 MySQL(8.0 版本)

步骤 1:安装服务

1
2
3
4
5
# Ubuntu/Debian
sudo apt install mysql-server -y

# CentOS/RHEL
# sudo yum install mysql-community-server -y

步骤 2:初始化配置(设置密码/创建测试库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 进入 MySQL 控制台(Ubuntu 默认 root 免密)
sudo mysql -u root

# 2. 设置 root 密码(替换为你的密码,如 MyPass123!)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!';
FLUSH PRIVILEGES;

# 3. 创建测试数据库
CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 4. 退出
exit;

# 5. 启动并开机自启
sudo systemctl start mysql
sudo systemctl enable mysql

# 6. 验证(输入密码能登录即成功)
mysql -u root -p

3. 安装 MongoDB(6.0 社区版)

步骤 1:配置官方源(Ubuntu)

1
2
3
4
5
6
7
8
# 导入 GPG 密钥
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -

# 添加源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

# 更新源
sudo apt update

步骤 2:安装并启动

1
2
3
4
5
6
sudo apt install mongodb-org -y
sudo systemctl start mongod
sudo systemctl enable mongod

# 验证(显示 running 即成功)
sudo systemctl status mongod

步骤 3:开启认证(可选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 进入 MongoDB 控制台
mongosh

# 创建管理员用户
use admin
db.createUser({
user: "root",
pwd: "MyPass123!",
roles: [{ role: "root", db: "admin" }]
});

# 创建测试库
use test_mongo_db;

# 退出并修改配置开启认证
exit;
sudo vim /etc/mongod.conf
# 添加以下配置:
security:
authorization: enabled

# 重启服务
sudo systemctl restart mongod

4. 安装 SQLite(Linux 自带,验证即可)

SQLite 是嵌入式数据库,无需服务,Ubuntu/CentOS 均预装:

1
2
3
4
5
6
# 验证版本
sqlite3 --version

# 测试创建数据库文件
sqlite3 test_sqlite.db "CREATE TABLE test (id INT);"
ls -l test_sqlite.db # 生成文件即成功

5. 安装 Node.js(JS 运行环境)

1
2
3
4
5
6
7
# 安装 Node.js 18.x(LTS 版本)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install nodejs -y

# 验证安装
node -v # 显示 v18.x.x 即成功
npm -v # 显示 9.x.x 即成功

二、安装 JS ORM 依赖

创建项目目录并安装核心依赖:

1
2
3
4
5
6
7
8
# 创建项目目录
mkdir js-orm-demo && cd js-orm-demo

# 初始化 package.json
npm init -y

# 安装依赖
npm install sequelize mongoose mysql2 sqlite3 dotenv --save
  • sequelize:MySQL/SQLite 的 ORM 核心;
  • mongoose:MongoDB 的 ORM/ODM 框架;
  • mysql2:MySQL 驱动(Sequelize 推荐);
  • sqlite3:SQLite 驱动;
  • dotenv:管理环境变量(避免硬编码密码)。

三、ORM 实现 CRUD 操作(JavaScript)

1. 配置文件(.env)

在项目根目录创建 .env,存放数据库连接信息:

1
2
3
4
5
6
7
8
9
# MySQL 连接配置
MYSQL_URI=mysql://root:MyPass123!@localhost:3306/test_db

# SQLite 连接配置(文件路径)
SQLITE_URI=sqlite://./test_sqlite.db

# MongoDB 连接配置(开启认证则带账号密码)
MONGO_URI=mongodb://root:MyPass123!@localhost:27017/test_mongo_db
# 未开启认证:MONGO_URI=mongodb://localhost:27017/test_mongo_db

2. MySQL 操作(Sequelize)

创建 mysql-crud.js,实现完整 CRUD:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
require('dotenv').config();
const { Sequelize, DataTypes, Model } = require('sequelize');

// 1. 初始化 Sequelize 连接 MySQL
const sequelize = new Sequelize(process.env.MYSQL_URI);

// 2. 定义数据模型(对应 MySQL 表)
class User extends Model {}
User.init({
// 字段定义
name: {
type: DataTypes.STRING(50), // 字符串,长度50
allowNull: false // 非空
},
age: {
type: DataTypes.INTEGER, // 整数
validate: {
min: 0 // 年龄最小值0
}
}
}, {
sequelize, // 关联 Sequelize 实例
tableName: 'users', // 表名
timestamps: true // 自动生成 createdAt/updatedAt 字段
});

// 3. 测试连接并执行 CRUD
async function crudDemo() {
try {
// 测试数据库连接
await sequelize.authenticate();
console.log('MySQL 连接成功!');

// 同步模型到数据库(创建表,若已存在则不覆盖)
await User.sync({ force: false });

// ====== 新增(Create)======
const newUser = await User.create({ name: '张三', age: 25 });
console.log('新增用户:', { id: newUser.id, name: newUser.name });

// ====== 查询(Read)======
// 单条查询(按 ID)
const user = await User.findByPk(newUser.id);
console.log('查询用户:', { name: user.name, age: user.age });

// 列表查询(条件筛选)
const users = await User.findAll({
where: { age: { [Sequelize.Op.gte]: 20 } } // 年龄≥20
});
console.log('20岁以上用户:', users.map(u => u.name));

// ====== 更新(Update)======
await user.update({ age: 26 });
console.log('更新后年龄:', user.age);

// ====== 删除(Delete)======
await user.destroy();
console.log('删除用户成功!');

} catch (error) {
console.error('操作失败:', error.message);
} finally {
// 关闭连接
await sequelize.close();
}
}

// 执行 CRUD
crudDemo();

3. SQLite 操作(Sequelize)

SQLite 与 MySQL 仅连接 URI 不同,Sequelize 语法完全通用。创建 sqlite-crud.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
require('dotenv').config();
const { Sequelize, DataTypes, Model } = require('sequelize');

// 1. 初始化 Sequelize 连接 SQLite(无需服务,文件即数据库)
const sequelize = new Sequelize(process.env.SQLITE_URI);

// 2. 定义模型(商品表)
class Product extends Model {}
Product.init({
name: {
type: DataTypes.STRING(100),
allowNull: false
},
price: {
type: DataTypes.INTEGER,
allowNull: false
}
}, {
sequelize,
tableName: 'products',
timestamps: true
});

// 3. CRUD 操作
async function crudDemo() {
try {
await sequelize.authenticate();
console.log('SQLite 连接成功!');
await Product.sync({ force: false });

// 新增
const newProduct = await Product.create({ name: '手机', price: 2999 });
console.log('新增商品:', { id: newProduct.id, name: newProduct.name });

// 查询
const product = await Product.findByPk(newProduct.id);
console.log('查询商品:', { name: product.name, price: product.price });

// 更新
await product.update({ price: 2899 });
console.log('更新后价格:', product.price);

// 删除
await product.destroy();
console.log('删除商品成功!');

} catch (error) {
console.error('操作失败:', error.message);
} finally {
await sequelize.close();
}
}

crudDemo();

4. MongoDB 操作(Mongoose)

MongoDB 是文档型数据库,无“表”概念,用“集合(Collection)”替代。创建 mongodb-crud.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
require('dotenv').config();
const mongoose = require('mongoose');

// 1. 连接 MongoDB
mongoose.connect(process.env.MONGO_URI)
.then(() => console.log('MongoDB 连接成功!'))
.catch(err => console.error('MongoDB 连接失败:', err));

// 2. 定义 Schema(文档结构)
const studentSchema = new mongoose.Schema({
name: {
type: String,
required: true, // 必传
maxlength: 50
},
age: {
type: Number,
required: true,
min: 0
},
grade: {
type: String,
maxlength: 20
}
}, {
timestamps: true // 自动生成 createdAt/updatedAt
});

// 3. 创建 Model(对应 MongoDB 集合)
const Student = mongoose.model('Student', studentSchema, 'students');

// 4. CRUD 操作
async function crudDemo() {
try {
// ====== 新增(Create)======
const student = new Student({ name: '李四', age: 18, grade: '高一' });
await student.save();
console.log('新增学生:', { id: student._id, name: student.name });

// ====== 查询(Read)======
// 单条查询(按 ID)
const s = await Student.findById(student._id);
console.log('查询学生:', { name: s.name, grade: s.grade });

// 列表查询(条件筛选)
const students = await Student.find({ age: { $gte: 18 } });
console.log('18岁以上学生:', students.map(stu => stu.name));

// ====== 更新(Update)======
await Student.findByIdAndUpdate(student._id, { age: 19 });
const updatedStu = await Student.findById(student._id);
console.log('更新后年龄:', updatedStu.age);

// ====== 删除(Delete)======
await Student.findByIdAndDelete(student._id);
console.log('删除学生成功!');

} catch (error) {
console.error('操作失败:', error.message);
} finally {
// 关闭连接
await mongoose.disconnect();
}
}

// 执行 CRUD
crudDemo();

5. 运行测试

1
2
3
4
5
6
7
8
# 运行 MySQL 测试
node mysql-crud.js

# 运行 SQLite 测试
node sqlite-crud.js

# 运行 MongoDB 测试
node mongodb-crud.js

运行后控制台会输出操作日志,可通过数据库控制台验证数据变化:

  • MySQL:mysql -u root -p test_db -e "SELECT * FROM users;"
  • SQLite:sqlite3 test_sqlite.db "SELECT * FROM products;"
  • MongoDB:mongosh test_mongo_db --eval "db.students.find()"

四、核心总结

1. JS ORM 选型关键点

框架 适配数据库 核心概念 优势
Sequelize MySQL/SQLite Model=表,Schema=字段 跨关系型数据库兼容,支持事务、关联查询
Mongoose MongoDB Schema=文档结构,Model=集合 适配 MongoDB 文档特性,验证/中间件丰富

2. 通用 CRUD 逻辑(JS 版)

  1. 初始化连接:通过 URI 建立数据库连接(Sequelize/Mongoose 均支持);
  2. 定义模型
    • 关系型(MySQL/SQLite):Model 映射表,字段定义含类型/校验;
    • 文档型(MongoDB):Schema 定义文档结构,Model 关联集合;
  3. 操作数据
    • 新增:create()(Sequelize)/ new Model().save()(Mongoose);
    • 查询:findByPk()/findAll()(Sequelize)/ findById()/find()(Mongoose);
    • 更新:update()(Sequelize)/ findByIdAndUpdate()(Mongoose);
    • 删除:destroy()(Sequelize)/ findByIdAndDelete()(Mongoose);
  4. 异常处理:用 try/catch 捕获错误,确保连接最终关闭。

3. 部署注意事项

  • 生产环境需关闭 Sequelize/Mongoose 的调试日志,避免性能损耗;
  • MySQL/MongoDB 需配置连接池(Sequelize/Mongoose 均支持),提升并发性能;
  • SQLite 仅适用于轻量场景(无并发/低数据量),生产环境优先选 MySQL/MongoDB。

通过这套方案,你可在 Linux 下快速部署三大数据库,并使用 JavaScript 生态的主流 ORM 框架实现统一风格的增删查改,屏蔽底层数据库语法差异,提升前端/全栈开发效率。


Node.js ORM 实现增删查改
https://cszy.top/20201213-linux-orm/
作者
csorz
发布于
2020年12月13日
许可协议