操作数据库
操作方式
在 Koa 应用中操作数据库时,可以选择使用数据库驱动或 ORM(对象关系映射)库。
数据库驱动
数据库驱动是直接与数据库进行交互的低级库,它提供了对数据库的基本操作接口。常见的数据库驱动包括 mysql2
、pg
、mongodb
等。 特点
- 直接操作数据库:
- 数据库驱动提供了对数据库的直接访问,允许你编写原生的 SQL 查询或数据库命令。
- 灵活性:
- 由于直接操作数据库,数据库驱动提供了更高的灵活性,适合需要复杂查询或特殊数据库操作的场景。
- 性能:
- 数据库驱动通常比 ORM 更轻量,性能开销更小,因为没有额外的抽象层。
- 学习曲线:
- 需要了解数据库的查询语言(如 SQL)和数据库驱动的 API。
ORM
ORM 是一种高级抽象层,提供了面向对象的方式来操作数据库。常见的 ORM 库包括 Sequelize
、TypeORM
、Mongoose
(针对 MongoDB)等。 特点
- 抽象层:
- ORM 提供了对数据库的抽象,使得操作数据库更加面向对象,减少了直接编写 SQL 查询的需求。
- 模型定义:
- ORM 允许你定义数据模型,并自动生成数据库表结构和关系。
- 便捷性:
- ORM 提供了许多便捷的方法来进行常见的数据库操作,如查询、插入、更新和删除数据。
- 迁移和同步:
- ORM 通常提供数据库迁移和同步功能,方便管理数据库的版本和结构变化。
- 学习曲线:
- 需要学习 ORM 的 API 和使用方法,但不需要深入了解数据库的查询语言。
区别总结
- 操作方式:
- 数据库驱动:直接编写 SQL 查询或数据库命令,灵活性高。
- ORM:通过面向对象的方式操作数据库,简化了数据库操作。
- 抽象层:
- 数据库驱动:没有额外的抽象层,直接与数据库交互。
- ORM:提供了高级抽象层,隐藏了底层的数据库操作细节。
- 便捷性:
- 数据库驱动:需要手动管理数据库连接和查询。
- ORM:提供了许多便捷的方法和功能,如模型定义、数据库迁移等。
- 性能:
- 数据库驱动:性能开销更小,因为没有额外的抽象层。
- ORM:性能开销稍大,因为有额外的抽象层和功能。
- 学习曲线:
- 数据库驱动:需要了解数据库的查询语言和驱动 API。
- ORM:需要学习 ORM 的 API 和使用方法,但不需要深入了解数据库查询语言。
mysql2
关系型数据库
(1)安装
npm install mysql2
1
(2)使用
js
const Koa = require('koa');
const Router = require('@koa/router');
const mysql = require('mysql2/promise');
const app = new Koa();
const router = new Router();
// 创建数据库连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});
// 全局错误处理
app.use(async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body = { message: err.message };
console.error('Error occurred:', err);
}
});
// 查询用户列表
router.get('/users', async (ctx) => {
const connection = await pool.getConnection();
try {
const [rows] = await connection.query('SELECT * FROM users');
ctx.body = rows;
} finally {
connection.release();
}
});
// 添加新用户
router.post('/users', async (ctx) => {
const { name, email } = ctx.request.body;
const connection = await pool.getConnection();
try {
const [result] = await connection.query('INSERT INTO users (name, email) VALUES (?, ?)', [name, email]);
ctx.body = { id: result.insertId, name, email };
} finally {
connection.release();
}
});
// 使用路由中间件
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
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
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
MongoDB
NoSQL 数据库
(1)安装
bash
npm install mongoose
1
(2)使用
js
const Koa = require('koa');
const Router = require('@koa/router');
const mongoose = require('mongoose');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const router = new Router();
// 连接到 MongoDB
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
// 定义用户模型
const User = mongoose.model('User', new mongoose.Schema({
name: String,
email: String
}));
// 全局错误处理
app.use(async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body = { message: err.message };
console.error('Error occurred:', err);
}
});
// 使用 koa-bodyparser 中间件
app.use(bodyParser());
// 查询用户列表
router.get('/users', async (ctx) => {
const users = await User.find();
ctx.body = users;
});
// 添加新用户
router.post('/users', async (ctx) => {
const { name, email } = ctx.request.body;
const user = new User({ name, email });
await user.save();
ctx.body = user;
});
// 使用路由中间件
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
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
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
redis
bash
npm install ioredis
1
js
const Koa = require('koa');
const Redis = require('ioredis');
const app = new Koa();
// 创建 Redis 客户端
const redis = new Redis({
host: 'localhost', // Redis 服务器地址
port: 6379, // Redis 端口
// password: 'your_password', // 如果需要密码,取消注释并填写
});
// 中间件:使用 Redis 进行缓存
app.use(async (ctx, next) => {
const cacheKey = `response:${ctx.url}`;
const cachedResponse = await redis.get(cacheKey);
if (cachedResponse) {
// 如果缓存中有响应,直接返回
ctx.body = JSON.parse(cachedResponse);
} else {
// 否则,继续处理请求
await next();
// 将响应缓存到 Redis 中,设置过期时间为 60 秒
await redis.set(cacheKey, JSON.stringify(ctx.body), 'EX', 60);
}
});
// 示例路由
app.use(async ctx => {
// 模拟数据获取
const data = { message: 'Hello, Koa with Redis!' };
ctx.body = data;
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
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
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
使用 ORM 库
Sequelize
(1)安装
bash
npm install sequelize mysql2
1
(2)使用
js
const Koa = require('koa');
const Router = require('@koa/router');
const bodyParser = require('koa-bodyparser');
const { Sequelize, DataTypes } = require('sequelize');
const app = new Koa();
const router = new Router();
// 创建 Sequelize 实例
const sequelize = new Sequelize('test', 'root', 'password', {
host: 'localhost',
dialect: 'mysql'
});
// 定义用户模型
const User = sequelize.define('User', {
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false
}
});
// 同步模型
sequelize.sync();
// 全局错误处理
app.use(async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body = { message: err.message };
console.error('Error occurred:', err);
}
});
// 使用 koa-bodyparser 中间件
app.use(bodyParser());
// 查询用户列表
router.get('/users', async (ctx) => {
const users = await User.findAll();
ctx.body = users;
});
// 添加新用户
router.post('/users', async (ctx) => {
const { name, email } = ctx.request.body;
const user = await User.create({ name, email });
ctx.body = user;
});
// 使用路由中间件
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
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
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