yii 3.0 迁移是解耦的独立组件,yii 2.0 是框架内置模块;3.0 使用 psr-14 和 migrationinterface、无强制时间戳命名、默认事务执行、支持多库与依赖声明,2.0 依赖 yii\db\migration、固定时间戳文件名、需显式启用事务、仅单库硬编码。

Yii 2.0 和 Yii 3.0 的数据库迁移机制核心目标一致(版本化、可回滚地管理数据库结构变更),但实现方式、命令结构和底层设计差异显著。Yii 3.0 并非 Yii 2.0 的简单升级,而是完全重写的框架,迁移系统也彻底重构。下面分点说明关键区别与操作方式:
Yii 2.0 的迁移操作(基于命令行 + PHP 类)
- 迁移文件存放在
@app/migrations/目录,每个文件是一个继承yii\db\Migration的 PHP 类 - 文件名格式固定:
mYYYYMMDD_HHIISS_<name>.php</name>(如m200101_120000_add_status_to_user.php),时间戳由框架自动生成,不可手动修改 - 常用命令(在项目根目录执行):
- 创建迁移:
php yii migrate/create add_status_to_user - 应用迁移:
php yii migrate/up - 回退迁移:
php yii migrate/down - 查看状态:
php yii migrate/status - 指定执行某一个:
php yii migrate/up 1或php yii migrate/to m200101_120000_add_status_to_user
- 创建迁移:
-
up()和down()方法中使用$this->createTable()、$this->addColumn()等抽象方法,保证跨数据库兼容性 - 生产环境禁用
migrate/up不带参数的“全量执行”,必须显式指定版本或使用--interactive=0配合严格流程 - 迁移历史记录保存在数据库的
migration表中,手动修改已执行的迁移文件会导致Migration history is corrupted错误
Yii 3.0 的迁移操作(基于 PSR-14 + 独立迁移组件)
- Yii 3.0 不再内置迁移功能,而是通过官方扩展
yiisoft/db-migration提供支持 - 安装方式:
composer require yiisoft/db-migration - 迁移文件默认位于
migrations/目录,类需实现Yiisoft\Db\Migration\Interfaces\MigrationInterface,不再继承基类 - 文件命名更自由(无强制时间戳前缀),但推荐使用语义化名称如
AddStatusToUserMigration,配合datetime注释或配置控制顺序 - 命令行工具由
yiisoft/db-migration提供,需注册为 CLI 命令(通常在config/console.php中配置) - 常用命令(假设已正确配置 CLI):
- 创建迁移:
php yii migrate/create AddStatusToUser - 应用迁移:
php yii migrate/up - 回退迁移:
php yii migrate/down - 列出待执行项:
php yii migrate/status
- 创建迁移:
- 支持依赖声明(通过
getDependencies(): array方法返回其他迁移类名),解决并发开发时的执行顺序问题 - 默认启用事务包裹
up()和down()(即safeUp/safeDown成为标准行为),异常时自动回滚,更安全 - 不再硬编码
migration表名,可通过配置指定表名、连接组件名(支持多数据库迁移)
关键差异总结
- 架构解耦:Yii 2.0 迁移是框架核心一部分;Yii 3.0 将其下沉为可选组件,符合“微内核+插件”设计理念
- 命名与发现:2.0 强制时间戳排序;3.0 依赖类名+接口+配置,更灵活,也更适合测试与 DI
-
安全性默认值:3.0 默认事务化执行,2.0 需显式使用
safeUp()才启用事务 -
多库支持:3.0 原生支持为不同 DB connection 分别运行迁移;2.0 需手动切换
Yii::$app->db或扩展命令 - 生态兼容性:Yii 3.0 迁移可与其他 PSR 标准工具(如 Doctrine Migrations)共存;2.0 是封闭体系
迁移不是 SQL 控制台,无论哪个版本,都应坚持:
- 迁移只做 DDL 和极简 DML(如初始数据
insert) - 不写业务逻辑、不调用模型、不依赖外部服务
- 已上线环境禁止
down()删除字段或表——用alter替代,保留数据完整性
基本上就这些。











