用途:在离线优先 Flutter 应用中,安全地对本地 Drift/SQLite 数据库执行 schema 变更。此类应用没有服务器和重新同步通道,设备数据库是唯一数据源,迁移出错会永久破坏用户手输记录且无人上报,因此本技能要求人工按固定顺序、低自由度地执行。
主要能力与规则:迁移前必须先在组合边界(打开 AppDatabase 处)做快照,不放在 onUpgrade 内;先对活动句柄执行 PRAGMA wal_checkpoint(TRUNCATE),再在无连接打开时复制数据库文件及其 -wal/-shm 附属文件。只允许前向迁移,不写 down migration,回滚即恢复快照。迁移步骤只追加,绝不修改已发布的步骤;每次变更 schemaVersion 只加一,并添加对应的 fromNToM 分支。提交版本化 schema 快照与 schema_versions.dart。打开数据库需包在 try/restore 中,失败时先关闭连接再恢复快照并重抛。新列只存规范值。
必要命令:dart run drift_dev make-migrations;dart run build_runner build --delete-conflicting-outputs。若不使用 make-migrations,则改用三条显式命令:dart run drift_dev schema dump lib/data/app_database.dart drift_schemas/、dart run drift_dev schema generate --data-classes --companions drift_schemas/ test/drift/generated/、dart run drift_dev schema steps drift_schemas/ lib/data/schema_versions.dart。
验证与限制:migrateAndValidate 只比对 CREATE 语句,不读行,通过也不代表数据完好;必须补充内容测试,覆盖所有 from→to 路径(含跨版本跳跃)、PRAGMA integrity_check 为 ok、PRAGMA foreign_key_check 为空,以及强制迁移中途抛错后能恢复快照。PRAGMA foreign_keys 在事务开启后会被忽略,须在 onUpgrade 顶部、事务之前关闭,并在 beforeOpen 中重新开启。flutter test 运行于普通 Dart VM,macOS 回退系统 libsqlite3 存在版本偏差风险,Linux 需先安装 libsqlite3-dev。多包工作区中须在拥有数据库的包内运行命令,并保持 drift_schemas/ 与 schema_versions.dart 在该包内。