LLM-test/test/sql/2-sql测试-1/mock/README.md

235 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SQL Mock 数据生成器
一个使用 Mockjs 为 SQL 表生成随机模拟数据的 Node.js 项目,专为 `minimax-2.1-api.sql` 文件中的15个电商相关表设计。
## 功能特性
- 为15个关联表生成合理的模拟数据
- 自动处理外键依赖关系
- 支持干运行模式(仅生成不插入)
- 可配置数据量大小
- 可导出生成数据到JSON文件
- 详细的统计信息
## 数据库表
项目支持以下15个表的数据生成
1. **Users** - 用户表
2. **Categories** - 分类表(自关联)
3. **Products** - 产品表
4. **ProductCategories** - 产品-分类关联表(多对多)
5. **Orders** - 订单表
6. **OrderItems** - 订单详情表
7. **Addresses** - 地址表
8. **Reviews** - 评论表
9. **CartItems** - 购物车表
10. **ProductViews** - 产品浏览历史表
11. **Coupons** - 优惠券表
12. **UserCoupons** - 用户优惠券关联表
13. **Wishlists** - 产品收藏表
14. **Payments** - 支付记录表
15. **Admins** - 管理员表
## 安装
```bash
# 安装依赖
npm install
# 或者使用 yarn
yarn install
```
## 配置
编辑 `config/database.js` 文件,填写您的 MySQL 连接信息:
```javascript
const config = {
development: {
host: 'localhost', // MySQL主机地址
port: 3306, // 端口
user: 'root', // 用户名
password: 'password', // 密码
database: 'TestECommerceDB', // 数据库名
connectionLimit: 10,
waitForConnections: true,
charset: 'utf8mb4'
}
};
```
**注意**:项目初始配置为空,需要您手动填写。
## 使用方法
### 1. 生成数据并插入数据库
```bash
npm start
# 或
node src/index.js
```
### 2. 干运行模式(仅生成数据,不插入)
```bash
npm run generate
# 或
node src/index.js --dry-run
```
### 3. 生成数据并保存到JSON文件
```bash
node src/index.js --output ./data/generated/mock-data.json
```
### 4. 调整数据量大小
```bash
# 使用乘数因子增加数据量默认1倍
node src/index.js --count-factor 2 # 生成2倍数据
```
### 5. 清空表数据(慎用)
```bash
node src/index.js --truncate
```
### 6. 查看详细日志
```bash
node src/index.js --verbose
```
## 命令行选项
| 选项 | 缩写 | 描述 |
|------|------|------|
| `--dry-run` | `-d` | 仅生成数据,不插入数据库 |
| `--output <file>` | `-o` | 输出生成数据到JSON文件 |
| `--count-factor <number>` | `-c` | 数据量乘数因子默认1 |
| `--truncate` | `-t` | 清空表数据(慎用) |
| `--verbose` | `-v` | 显示详细日志 |
| `--version` | `-V` | 显示版本信息 |
| `--help` | `-h` | 显示帮助信息 |
## 项目结构
```
mock/
├── package.json # 项目依赖配置
├── README.md # 项目说明文档
├── config/
│ ├── database.js # 数据库配置
│ └── mock-rules.js # Mock数据规则配置
├── src/
│ ├── index.js # 主入口文件
│ ├── database/
│ │ ├── connection.js # 数据库连接管理
│ │ ├── schema-parser.js # SQL文件解析器占位符
│ │ └── seed-orders.js # 数据插入顺序管理
│ ├── mock-generators/
│ │ ├── index.js # Mock生成器入口
│ │ ├── base-generator.js # 基础生成器类
│ │ ├── users.js # 用户数据生成器
│ │ ├── categories.js # 分类数据生成器
│ │ ├── products.js # 产品数据生成器
│ │ ├── addresses.js # 地址数据生成器
│ │ └── ...其他生成器(待实现)
│ └── utils/
│ ├── helpers.js # 辅助函数
│ ├── validators.js # 数据验证器(占位符)
│ └── logger.js # 日志记录器(占位符)
├── data/
│ ├── generated/ # 生成的Mock数据备份
│ └── sql/
│ └── minimax-2.1-api.sql # 原始SQL文件
└── scripts/
├── init-database.js # 初始化数据库脚本(占位符)
└── seed-data.js # 插入数据脚本(占位符)
```
## 数据插入顺序
基于外键依赖关系,数据插入按照以下顺序进行:
**第一轮:无依赖或自依赖的表**
1. Categories先顶级分类后子分类
2. Users
3. Admins
4. Coupons
**第二轮:依赖第一轮表的表**
5. Products依赖Categories
6. Addresses依赖Users
7. ProductCategories依赖Products和Categories
8. CartItems、Wishlists、ProductViews依赖Users和Products
**第三轮:依赖第二轮表的表**
9. Orders依赖Users、Addresses
10. OrderItems依赖Orders、Products
11. Reviews依赖Users、Products、Orders
12. Payments依赖Orders
13. UserCoupons依赖Users、Coupons、Orders
## 扩展项目
### 添加新的Mock生成器
1.`src/mock-generators/` 目录下创建新的生成器类
2. 继承 `BaseGenerator`
3. 实现 `generateField` 方法
4.`src/mock-generators/index.js` 中导出新生成器
5.`src/database/seed-orders.js` 中添加种子配置
### 示例生成器结构
```javascript
const BaseGenerator = require('./base-generator');
class NewTableGenerator extends BaseGenerator {
constructor() {
super('NewTable', {
// 字段定义
});
}
generateField(fieldName, definition, index) {
// 字段生成逻辑
}
}
```
## 注意事项
1. **MySQL地址留空**:初始配置为空,需要手动填写
2. **外键依赖**:项目自动处理外键关系,但需要正确配置依赖
3. **数据合理性**:生成器已考虑业务逻辑,但可能需要根据实际需求调整
4. **性能**:大数据量插入时建议分批进行
## 故障排除
### 数据库连接失败
- 检查 `config/database.js` 配置是否正确
- 确保MySQL服务正在运行
- 验证用户名和密码
### 外键约束错误
- 检查 `seed-orders.js` 中的依赖配置
- 确保父表数据已正确生成和插入
### 数据生成不合理
- 调整 `config/mock-rules.js` 中的规则
- 修改生成器类中的字段生成逻辑
## 许可证
MIT
## 贡献
欢迎提交 Issue 和 Pull Request 来改进本项目。