74 lines
2.4 KiB
Markdown
74 lines
2.4 KiB
Markdown
|
# 团队数据库连接工具使用指南
|
|||
|
|
|||
|
## 简介
|
|||
|
|
|||
|
团队数据库连接工具提供了一种便捷的方式来连接和管理团队级别的数据库。该工具会从请求中自动获取团队信息,并连接到对应的数据库。
|
|||
|
|
|||
|
## 基本用法
|
|||
|
|
|||
|
使用团队数据库连接工具非常简单,只需直接将处理函数传递给`connectTeamDB`:
|
|||
|
|
|||
|
```typescript
|
|||
|
import { connectTeamDB, RequestWithDB } from '@/lib/db';
|
|||
|
|
|||
|
export const GET = connectTeamDB(async (req: RequestWithDB) => {
|
|||
|
// 数据库连接已经附加到req.db上
|
|||
|
const [rows] = await req.db.query('SELECT * FROM your_table');
|
|||
|
return NextResponse.json({ data: rows });
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
使用时,需要确保请求中包含团队标识,可以通过以下方式之一提供:
|
|||
|
- HTTP头:`x-team-id`
|
|||
|
- URL查询参数:`?teamId=xxx`
|
|||
|
|
|||
|
## 连接池管理
|
|||
|
|
|||
|
团队数据库连接工具会自动为每个不同的数据库维护一个连接池,并在适当的时候复用它们。你不需要手动管理连接池的创建和销毁。
|
|||
|
|
|||
|
## 最佳实践
|
|||
|
|
|||
|
1. **正确处理错误**:始终在查询中使用try-catch来捕获和处理可能的数据库错误。
|
|||
|
|
|||
|
2. **不要手动释放连接**:中间件会自动管理连接的获取和释放,你不需要手动调用`connection.release()`。
|
|||
|
|
|||
|
## 示例
|
|||
|
|
|||
|
### 基本查询示例
|
|||
|
```typescript
|
|||
|
export const GET = connectTeamDB(async (req: RequestWithDB) => {
|
|||
|
try {
|
|||
|
const [users] = await req.db.query('SELECT * FROM users WHERE status = ?', ['active']);
|
|||
|
return NextResponse.json({ users });
|
|||
|
} catch (error) {
|
|||
|
console.error('查询失败:', error);
|
|||
|
return NextResponse.json({ error: '查询失败' }, { status: 500 });
|
|||
|
}
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
### 事务示例
|
|||
|
```typescript
|
|||
|
export const POST = connectTeamDB(async (req: RequestWithDB) => {
|
|||
|
// 开始事务
|
|||
|
await req.db.beginTransaction();
|
|||
|
|
|||
|
try {
|
|||
|
const { userId, amount } = await req.json();
|
|||
|
|
|||
|
// 执行多个查询
|
|||
|
await req.db.query('UPDATE accounts SET balance = balance - ? WHERE user_id = ?', [amount, userId]);
|
|||
|
await req.db.query('INSERT INTO transactions (user_id, amount) VALUES (?, ?)', [userId, amount]);
|
|||
|
|
|||
|
// 提交事务
|
|||
|
await req.db.commit();
|
|||
|
|
|||
|
return NextResponse.json({ success: true });
|
|||
|
} catch (error) {
|
|||
|
// 回滚事务
|
|||
|
await req.db.rollback();
|
|||
|
console.error('事务失败:', error);
|
|||
|
return NextResponse.json({ error: '交易失败' }, { status: 500 });
|
|||
|
}
|
|||
|
});
|
|||
|
```
|