schema.sql,不要再执行 legacy 中的历史升级脚本。migrate-local.ps1,脚本会按文件名顺序执行 migrations,并自动跳过已登记版本。legacy/2026-07-28,仅用于追溯,禁止批量执行。backend/db/
├─ schema.sql # 当前完整结构快照,仅用于新建数据库
├─ init-local.ps1 # 新建/重建本地数据库
├─ migrate-local.ps1 # 已有数据库增量迁移入口
├─ verify.sql # 查询迁移记录和关键功能完整性
├─ migrations/ # 以后唯一允许新增迁移脚本的位置
│ └─ 20260728_150000_current_schema_baseline.sql
└─ legacy/2026-07-28/ # 已归档旧脚本,不再执行
cd "F:/code/TourGuide/backend/db"
./init-local.ps1
作用:执行完整的 schema.sql,创建当前代码所需全部表、索引、默认数据,并登记当前结构基线。
cd "F:/code/TourGuide/backend/db"
./migrate-local.ps1
作用:
tour_guide 是否存在。sys_schema_migration。migrations/*.sql。$env:MYSQL_PWD = "你的密码"
mysql --default-character-set=utf8mb4 -h "127.0.0.1" -P 3306 -u "root" -D "tour_guide" -e "source F:/code/TourGuide/backend/db/verify.sql"
Remove-Item Env:MYSQL_PWD
核对时数据库实际已经包含:
但 sys_schema_migration 当时只登记了:
20260728_100213_REVIEW_MANAGEMENT20260728_120000_FEEDBACK_MANAGEMENT因此不能再通过“迁移记录缺失”判断脚本未执行。新的基线迁移会先验证实际结构,再登记:
20260728_150000_CURRENT_SCHEMA_BASELINE以后每个迁移文件必须:
yyyyMMdd_HHmmss_feature_name.sql。-- migration-version: VERSION。sys_schema_migration 写入相同的 VERSION。CREATE TABLE IF NOT EXISTS 或结构检查,避免重复执行产生破坏。Unknown column 'xxx' in 'field list',通常表示代码实体已经新增字段,但当前数据库尚未执行对应迁移。migrate-local.ps1,不要通过重新执行完整 schema.sql 修复字段缺失。mini_user.id_card_no 对应迁移版本为 20260729_120000_ADD_MINI_USER_ID_CARD。sys_schema_migration 记录,避免只完成部分结构变更。示例:
-- migration-version: 20260729_090000_EXAMPLE
USE `tour_guide`;
-- 数据库变更内容
INSERT IGNORE INTO `sys_schema_migration` (`version`, `description`)
VALUES ('20260729_090000_EXAMPLE', '示例迁移');