1. yii\db\Migration
包含哪些部分?
想象一下,你在建造一座房子:
- 你需要一份详细的施工计划(迁移类)来定义每一步操作。
- 在 Yii2 中,
yii\db\Migration
是一个基类,提供了工具和方法来帮助你定义数据库的变更逻辑。
(1) 核心组成部分
-
up()
方法:- 定义如何应用数据库变更。
- 示例:创建表、添加字段、插入数据等。
-
down()
方法:- 定义如何回滚数据库变更。
- 示例:删除表、移除字段、恢复数据等。
-
辅助方法:
- 提供了一系列便捷的方法,用于执行常见的数据库操作。
- 常见方法包括:
createTable()
:创建表。addColumn()
:添加字段。dropColumn()
:删除字段。insert()
:插入数据。update()
:更新数据。delete()
:删除数据。addForeignKey()
:添加外键。createIndex()
:创建索引。dropTable()
:删除表。
-
示例代码:
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(), 'created_at' => $this->integer()->notNull(), 'updated_at' => $this->integer()->notNull(), ]); } public function down() { $this->dropTable('user'); } }
2. 使用场景是什么?
(1) 数据库版本管理
- 场景:团队协作开发时,需要统一管理数据库结构的变化。
- 示例:
- 开发新功能时,可能需要新增表或字段。
- 使用迁移可以确保所有开发者和生产环境的数据库结构保持一致。
(2) 动态调整表结构
- 场景:在现有系统中扩展功能时,动态修改数据库表结构。
- 示例:
- 在用户管理系统中,新增一个字段存储用户的“地址”。
- 删除不再使用的字段以优化表结构。
(3) 数据初始化
- 场景:在部署新环境时,初始化数据库中的数据。
- 示例:
public function up() { $this->insert('user', [ 'username' => 'admin', 'email' => 'admin@example.com', 'created_at' => time(), 'updated_at' => time(), ]); }
(4) 回滚变更
- 场景:如果某个迁移导致问题,可以通过回滚恢复到之前的状态。
- 示例:
# 回滚最后一个迁移 yii migrate/down
(5) 自动化部署
- 场景:在持续集成/持续部署(CI/CD)流程中,自动应用最新的迁移。
- 示例:
# 在部署脚本中运行迁移 yii migrate --interactive=0
3. 底层原理是什么?
(1) 继承与封装
- 继承机制:
- 每个迁移类都继承自
yii\db\Migration
。 yii\db\Migration
提供了通用的数据库操作方法。
- 每个迁移类都继承自
- 封装 SQL:
- 迁移方法(如
createTable()
、addColumn()
)内部会生成对应的 SQL 语句。 - 示例生成的 SQL:
CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, created_at INT NOT NULL, updated_at INT NOT NULL );
- 迁移方法(如
(2) 数据库连接
- DB Connection:
yii\db\Migration
内部使用了 Yii2 的数据库组件(db
)来执行 SQL。- 数据库连接配置通常位于
config/db.php
文件中。
- 事务支持:
- 如果数据库支持事务(如 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 | created_at | updated_at |
+----+----------+-------+------------+------------+
| 1 | Alice | a@b.c | 1672531200 | 1672531200 |
| 2 | Bob | b@c.d | 1672531200 | 1672531200 |
+----+----------+-------+------------+------------+
5. 总结
(1) 核心组成部分
up()
和down()
方法:定义如何应用和回滚变更。- 辅助方法:提供便捷的数据库操作工具。
- 数据库连接:通过
db
组件执行 SQL。
(2) 使用场景
- 数据库版本管理。
- 动态调整表结构。
- 数据初始化。
- 回滚变更。
- 自动化部署。
(3) 底层原理
- 继承与封装:提供通用的数据库操作方法。
- SQL 语句生成:根据迁移方法生成对应的 SQL。
- 事务支持:确保迁移过程的一致性。
- 迁移表记录:记录已应用的迁移。