yii\db\Migration;一共包含哪些部分?使用场景是什么?底层原理是什么?

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
      );
      
(4) 执行流程
  • 扫描迁移文件
    • Yii2 会扫描 migrations 文件夹,找到所有未应用的迁移文件。
  • 执行迁移方法
    • 调用每个迁移文件中的 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。
  • 事务支持:确保迁移过程的一致性。
  • 迁移表记录:记录已应用的迁移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值