| .. | ||
| README.md | ||
MySQL 数据库初始化脚本
概述
本目录包含完整的 MySQL 数据库初始化脚本,用于初始化互动竞猜开宝箱系统的数据库。
文件说明
执行顺序
初始化脚本需要按以下顺序执行:
1. 00-quick-init.sql # 快速初始化(仅表结构)
2. 01-init-database.sql # 数据库配置
3. 02-create-tables.sql # 完整表结构(推荐)
4. 03-sample-data.sql # 示例测试数据
文件详情
1. 00-quick-init.sql - 快速初始化
- 用途: 快速创建基本表结构,用于开发和测试
- 内容: 4个核心表(users, transactions, chests, bets)
- 特点: 无外键约束,无索引,初始化速度快
- 适用场景: 快速原型开发、功能测试
2. 01-init-database.sql - 数据库配置
- 用途: 数据库基础配置和用户授权
- 内容:
- 设置时区为 UTC
- 创建应用用户
treasure_box - 授权所有权限
- 设置字符集为 UTF8MB4
- 注意: 此文件在 Docker 容器启动时自动执行
3. 02-create-tables.sql - 完整初始化(推荐)
- 用途: 生产级完整数据库初始化
- 内容:
- 4个核心表的完整结构
- 所有索引和外键约束
- 2个视图(活跃宝箱、用户排行)
- 1个存储过程(获取交易历史)
- 1个触发器(自动记录余额变化)
- 初始数据(1个管理员、1个主播、3个用户)
- 特点: 包含完整的业务逻辑和优化
- 适用场景: 生产环境、完整功能测试
4. 03-sample-data.sql - 示例数据
- 用途: 插入丰富的测试数据
- 内容:
- 1个管理员用户
- 3个主播用户
- 7个普通用户
- 多个已完成的宝箱
- 活跃宝箱
- 下注记录
- 交易流水
- 特点: 覆盖各种业务场景
- 适用场景: 功能演示、UI测试、数据分析
使用方法
方法 1: Docker 自动初始化(推荐)
Docker Compose 会自动按顺序执行所有脚本:
docker-compose up -d
脚本执行顺序:
- MySQL 容器启动
- 执行
01-init-database.sql - 后端服务启动
- 执行
02-create-tables.sql - (可选)手动执行
03-sample-data.sql
方法 2: 手动执行 SQL
如果你使用本地 MySQL 或需要手动初始化:
# 1. 登录 MySQL
mysql -u root -p
# 2. 创建数据库
CREATE DATABASE treasure_box_game CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE treasure_box_game;
# 3. 执行初始化脚本
source /path/to/00-quick-init.sql;
source /path/to/02-create-tables.sql;
source /path/to/03-sample-data.sql;
或者直接使用 MySQL 命令行:
mysql -u root -p treasure_box_game < 00-quick-init.sql
mysql -u root -p treasure_box_game < 02-create-tables.sql
mysql -u root -p treasure_box_game < 03-sample-data.sql
方法 3: 仅插入测试数据
如果表已存在,只想添加测试数据:
mysql -u root -p treasure_box_game < 03-sample-data.sql
测试账户
执行 02-create-tables.sql 或 03-sample-data.sql 后创建的测试账户:
管理员账户
用户名: admin
邮箱: admin@treasurebox.com
密码: password123
角色: admin
余额: 1,000,000 喵币
主播账户
用户名: streamer_lisa
邮箱: lisa@treasurebox.com
密码: password123
角色: streamer
余额: 500,000 喵币
用户名: streamer_john
邮箱: john@treasurebox.com
密码: password123
角色: streamer
余额: 300,000 喵币
普通用户账户
用户名: user001
邮箱: user001@example.com
密码: password123
角色: user
余额: 100,000 喵币
用户名: rich_user
邮箱: rich@example.com
密码: password123
角色: user
余额: 1,000,000 喵币(富豪榜第一)
用户名: poor_user
邮箱: poor@example.com
密码: password123
角色: user
余额: 500 喵币(可领取低保)
数据库结构
表列表
-
users - 用户表
- 用户基本信息
- 角色(user/streamer/admin)
- 余额和版本号(乐观锁)
-
transactions - 交易流水表
- 所有资金变动记录
- 类型(下注、获胜、低保等)
- 关联ID和描述
-
chests - 宝箱表
- 宝箱信息(标题、选项)
- 状态(下注中、已封盘、已完成等)
- 奖池金额和下注次数
-
bets - 下注表
- 用户下注记录
- 选项和金额
- 状态和奖金
视图
-
v_active_chests - 活跃宝箱视图
- 显示所有可下注或已封盘的宝箱
- 包含主播信息
-
v_user_ranking - 用户排行视图
- 按余额排序
- 包含排名信息
存储过程
- sp_get_user_transactions - 获取用户交易历史
CALL sp_get_user_transactions(1, 10, 0); -- 获取用户ID为1的交易记录,limit 10,offset 0
触发器
- tr_users_balance_update - 自动记录余额变化
- 当用户余额更新时,自动记录到交易流水
常用查询
查看所有表
SHOW TABLES;
查看表结构
DESCRIBE users;
查看活跃宝箱
SELECT * FROM v_active_chests;
查看富豪榜
SELECT * FROM v_user_ranking LIMIT 10;
查看用户交易历史
SELECT * FROM transactions WHERE user_id = 1 ORDER BY created_at DESC LIMIT 20;
查看宝箱下注详情
SELECT b.*, u.username
FROM bets b
JOIN users u ON b.user_id = u.id
WHERE b.chest_id = 1;
性能优化
索引
已创建的索引:
- 主键索引(自动)
- 用户名、邮箱唯一索引
- 外键索引(user_id, chest_id, streamer_id)
- 状态索引(status, role)
- 时间索引(created_at)
连接池配置
在 backend/app/core/config.py 中配置:
DB_POOL_SIZE = 20 # 连接池大小
DB_MAX_OVERFLOW = 30 # 最大溢出连接
DB_POOL_TIMEOUT = 30 # 超时时间(秒)
DB_POOL_RECYCLE = 3600 # 连接回收时间(秒)
字符集和排序规则
- 字符集: UTF8MB4(完整 Unicode 支持,包括 emoji)
- 排序规则: utf8mb4_unicode_ci
- 时区: UTC (+00:00)
注意事项
- 执行顺序: 必须按顺序执行脚本,否则可能出现依赖错误
- 数据清理: 如需重新初始化,先执行
DROP TABLE IF EXISTS - 外键约束: 完整版脚本启用了外键约束,确保数据一致性
- 密码哈希: 所有示例密码已使用 bcrypt 加密
- 字符集: 必须使用 UTF8MB4,否则可能出现编码问题
故障排除
问题 1: 外键约束错误
解决方案: 确保按正确顺序执行脚本,或暂时禁用外键检查:
SET FOREIGN_KEY_CHECKS = 0;
-- 执行脚本
SET FOREIGN_KEY_CHECKS = 1;
问题 2: 字符集错误
解决方案: 确保数据库创建时指定了正确的字符集:
CREATE DATABASE treasure_box_game
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
问题 3: 权限错误
解决方案: 确保使用 root 用户或有足够权限的用户执行脚本
备份和恢复
备份
mysqldump -u root -p treasure_box_game > backup.sql
恢复
mysql -u root -p treasure_box_game < backup.sql
联系信息
如有问题,请参考:
MYSQL_迁移指南.md- 完整迁移文档QUICKSTART.md- 快速启动指南项目完成报告.md- 项目文档