1. Yii2 的 Migration 包含哪些部分?
想象一下,你在建造一座房子:
- 你需要设计图纸(迁移文件)来规划每一步施工。
- 在 Yii2 中,Migration 就是这些设计图纸,用来定义数据库结构的变化(如创建表、添加字段、修改数据等)。
(1) 核心组成部分
-
迁移文件:
- 每个迁移文件是一个 PHP 类,包含
up()
和down()
方法。 up()
方法定义如何应用变更(如创建表、添加字段)。down()
方法定义如何回滚变更(如删除表、移除字段)。- 示例:
use yii\db\Migration; class m230101_000001_create_user_table extends Migration { public function up() { $this->createTable('user', [ 'id' => $this->primaryKey(), 'username' => $this->string()->notNull(), 'email' => $this->string()->notNull(), ]); } public function down() { $this->dropTable('user'); } }
- 每个迁移文件是一个 PHP 类,包含
-
迁移命令:
- 使用命令行工具运行迁移。
- 常见命令:
yii migrate
:应用所有未执行的迁移。yii migrate/create
:创建一个新的迁移文件。yii migrate/down
:回滚最后一个迁移。yii migrate/new
:查看尚未应用的迁移。yii migrate/history
:查看已应用的迁移历史。
-
迁移表:
- Yii2 使用一个特殊的表(默认名为
migration
)来记录已应用的迁移。 - 每次成功应用迁移后,其名称会被插入到该表中。
- 示例表结构:
CREATE TABLE migration ( version VARCHAR(180) PRIMARY KEY, apply_time INTEGER );
- Yii2 使用一个特殊的表(默认名为
2. 使用场景是什么?
(1) 数据库版本管理
- 场景:团队协作开发时,需要统一管理数据库结构的变化。
- 示例:
- 开发新功能时,可能需要新增表或字段。
- 使用迁移可以确保所有开发者和生产环境的数据库结构保持一致。
(2) 动态调整表结构
- 场景:在现有系统中扩展功能时,动态修改数据库表结构。
- 示例:
- 在用户管理系统中,新增一个字段存储用户的“地址”。
- 删除不再使用的字段以优化表结构。
(3) 回滚变更
- 场景:如果某个迁移导致问题,可以通过回滚恢复到之前的状态。
- 示例:
# 回滚最后一个迁移 yii migrate/down
(4) 自动化部署
- 场景:在持续集成/持续部署(CI/CD)流程中,自动应用最新的迁移。
- 示例:
# 在部署脚本中运行迁移 yii migrate --interactive=0
3. 底层原理是什么?
(1) 迁移文件的作用
- 定义变更逻辑:
- 每个迁移文件包含
up()
和down()
方法。 up()
方法定义如何应用变更(如创建表、添加字段)。down()
方法定义如何回滚变更(如删除表、移除字段)。
- 每个迁移文件包含
- 幂等性:
- 每次运行迁移时,系统会检查
migration
表,确保每个迁移只被执行一次。
- 每次运行迁移时,系统会检查
(2) 数据库操作
- SQL 语句生成:
- Yii2 的迁移工具会根据迁移方法(如
createTable()
、addColumn()
、dropColumn()
)生成对应的 SQL 语句。 - 示例生成的 SQL:
CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL );
- Yii2 的迁移工具会根据迁移方法(如
- 事务支持:
- 如果数据库支持事务(如 MySQL 的 InnoDB),Yii2 会在迁移过程中开启事务。
- 如果迁移失败,系统会自动回滚,确保数据库一致性。
(3) 迁移表记录
- 迁移表:
- Yii2 使用一个特殊的表(默认名为
migration
)来记录已应用的迁移。 - 每次成功应用迁移后,其名称会被插入到该表中。
- 示例表结构:
CREATE TABLE migration ( version VARCHAR(180) PRIMARY KEY, apply_time INTEGER );
- Yii2 使用一个特殊的表(默认名为
(4) 执行流程
- 扫描迁移文件:
- Yii2 会扫描
migrations
文件夹,找到所有未应用的迁移文件。
- Yii2 会扫描
- 执行迁移方法:
- 调用每个迁移文件中的
up()
方法。 - 如果迁移成功,将迁移名称写入
migration
表。
- 调用每个迁移文件中的
- 回滚迁移:
- 调用迁移文件中的
down()
方法。 - 从
migration
表中删除对应的记录。
- 调用迁移文件中的
4. 图示说明
(1) 迁移执行流程
1. 扫描 migrations 文件夹
|
v
2. 找到未应用的迁移文件
|
v
3. 提示用户确认:Apply the above migration? (yes|no) [no]:
|
v
4. 如果 yes -> 执行 up() 方法 -> 更新 migration 表
|
v
5. 如果 no -> 取消操作
(2) 数据库表结构
migration 表
+--------------------------+------------+
| version | apply_time |
+--------------------------+------------+
| m230101_000001_create_user_table | 1672531200 |
| m230102_000002_add_address_to_user | 1672617600 |
+--------------------------+------------+
user 表
+----+----------+-------+
| id | username | email |
+----+----------+-------+
| 1 | Alice | a@b.c |
| 2 | Bob | b@c.d |
+----+----------+-------+
5. 总结
(1) 核心组成部分
- 迁移文件:包含
up()
和down()
方法。 - 迁移命令:用于应用、回滚和查看迁移。
- 迁移表:记录已应用的迁移。
(2) 使用场景
- 数据库版本管理。
- 动态调整表结构。
- 回滚变更。
- 自动化部署。
(3) 底层原理
- 迁移表:记录已应用的迁移。
- SQL 语句生成:根据迁移方法生成对应的 SQL。
- 事务支持:确保迁移过程的一致性。