5.8 KiB
5.8 KiB
开发日志:2026-06-16 M01-B 数据库迁移与兼容层
1. 本次目标
建立首批正式数据库迁移、验证 SQL、最小 seed、旧表兼容映射和后端 MySQL 连接池基础。
2. 本次完成
- 新增
2026061601_m01b_core_schema的 up/down/verify SQL。 - 新增
qipai_tenants、qipai_stores、qipai_rooms、qipai_members、qipai_orders、qipai_payments、qipai_devices、qipai_audit_logs和qipai_legacy_table_mappings。 - 新增最小脱敏 seed,记录旧表到新表的首批映射。
- 新增
backend/src/db/mysql.ts,用mysql2/promise生成连接池配置。 - 新增迁移契约测试和连接池契约测试,并接入
npm test与check-backend.ps1。 - 调整连接池凭据字段传递方式,避免误触明文秘密扫描。
- 更新 release manifest dry-run,使其识别迁移文件已存在但尚未执行。
3. 修改文件
backend/package.jsonbackend/src/config.tsbackend/src/db/mysql.tsbackend/tests/migration-contract.test.mjsbackend/tests/mysql-pool-contract.test.mjsdatabase/migrations/2026061601_m01b_core_schema.*.sqldatabase/seeds/2026061601_m01b_minimal_seed.sqlscripts/dev/windows/check-backend.ps1scripts/dev/windows/check-release-manifest.ps1scripts/dev/windows/check-repo-completeness.ps1scripts/setup/deploy-business.sh
4. 数据库变化
- 是否有变化:是。
- 迁移文件:
database/migrations/2026061601_m01b_core_schema.up.sql、database/migrations/2026061601_m01b_core_schema.down.sql、database/migrations/2026061601_m01b_core_schema.verify.sql。 - 种子文件:
database/seeds/2026061601_m01b_minimal_seed.sql。 - 回滚方式:空库或演练库可执行 down SQL;生产含业务数据后必须先备份并人工确认。
5. API 变化
- 新增:无。
- 修改:无。
- 删除:无。
- 兼容旧接口:本轮只建立旧表映射,不暴露业务 API。
6. 前端变化
- 小程序:无。
- 后台管理端:无。
7. 部署变化
release manifest dry-run 已能记录 databaseMigration=PROJECT_PRESENT_MIGRATION_NOT_RUN。生产迁移执行入口尚未接入菜单,不能视为生产数据库已变更。
8. 测试结果
npm --prefix backend test:通过。powershell -ExecutionPolicy Bypass -File scripts/dev/windows/check-backend.ps1:通过。powershell -ExecutionPolicy Bypass -File scripts/dev/windows/check-secrets.ps1:通过。npm audit --omit=dev(在backend/执行):通过,生产依赖审计 0 漏洞。
9. 欠缺 / 风险
- 尚未连接真实 MySQL 执行 up/down/verify。
- Kysely 当前安全修复版要求 Node 22;本轮先使用
mysql2/promise连接池,后续若升级运行时再评估 Kysely。 - 旧数据迁移脚本未生成,真实旧库兼容读取 Repository 仍待下一步实现。
10. 下一步
为 M01-B 增加迁移执行器或 MySQL dry-run 环境,并建立旧表兼容读取 Repository 的第一批查询。
11. Git 与 Gitea 推送信息
- 远端:ssh://git@git.txyundm.cn:2222/panda/qipai.git
- 分支:main
- commit:
3add64b - push 命令:git push origin main
- push 结果:本轮最终推送后复核
- push 时间:2026-06-16
- HEAD 与 origin/main 是否一致:本轮最终推送后复核
- 失败原因与重试命令:无
12. 2026-06-18 续开发:迁移执行器与旧库只读兼容层
- 新增迁移 SQL 拆分器、SHA-256 计划摘要和
plan/up/verify/downCLI;计划模式不连接数据库。 verify不再以“查询未报错”作为成功条件,会检查核心表、租户/审计列和迁移版本的最少结果行数。- 新增旧表只读兼容 Repository,首批覆盖
member_store_info、member_room_info、member_order_info和member_device_info。 - 旧表查询强制租户过滤、参数化父级过滤、1–500 条分页上限和 SQL 标识符白名单,不提供写操作。
npm test:通过,新增迁移解析/执行与旧库 Repository 契约测试。npm run db:migrate:plan:通过,识别 11 条 up 语句,摘要为7e1e0b690aab5a99bbe32f80879621f512b04909c57c0ab26cddda4961ddd5de。scripts/dev/windows/check-backend.ps1:通过,包含编译、全部契约测试、迁移 dry-run 和真实 HTTP 健康检查。scripts/dev/windows/check-secrets.ps1:通过。- 工程提交:
e069c50 feat(M01-B): 增加迁移执行器与旧库只读兼容层。 - 未执行真实 MySQL up/verify/down:当前工作区未配置可丢弃测试库凭据,M01-B 保持
PARTIAL。 - 下一步:在一次性 MySQL 8 环境往返执行迁移,并实现旧 DECIMAL 金额到整数分的严格转换。
13. 2026-06-18 续开发:旧订单金额严格转换
- 新增
legacyDecimalToCents,直接按十进制字符串拆分并使用BigInt计算整数分,避免Number * 100的浮点误差。 - 旧订单兼容查询新增
price、pay_price、renew_price、group_pay_price、refund_price映射,统一输出对应的*Cents字段。 - 拒绝负数、科学计数法、前后空格、超过两位小数、非有限数字和非数字类型。
price按旧表NOT NULL约束处理;其余可空金额保留null。- 目标列按 MySQL
INT UNSIGNED上限4294967295分执行溢出检查。 npm test:通过,包含精确值、边界值、空值、格式错误、溢出和 Repository 集成测试。scripts/dev/windows/check-backend.ps1:通过,包含编译、全部契约测试、迁移 dry-run 和真实 HTTP 健康检查。scripts/dev/windows/check-secrets.ps1:通过。- 工程提交:
b8b384e feat(M01-B): 严格转换旧库订单金额。 - 未执行真实 MySQL up/verify/down:当前工作区仍未配置可丢弃 MySQL 8 测试库,M01-B 保持
PARTIAL。 - 下一步:在一次性 MySQL 8 中执行 up、verify、down、再次 up,并保存可复现结果。