yii2的migration一共包含哪些部分?使用场景是什么?底层原理是什么?

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');
          }
      }
      
  • 迁移命令

    • 使用命令行工具运行迁移。
    • 常见命令:
      • 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
      );
      

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
      );
      
  • 事务支持
    • 如果数据库支持事务(如 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 |
+----+----------+-------+
| 1  | Alice    | a@b.c |
| 2  | Bob      | b@c.d |
+----+----------+-------+

5. 总结

(1) 核心组成部分
  • 迁移文件:包含 up()down() 方法。
  • 迁移命令:用于应用、回滚和查看迁移。
  • 迁移表:记录已应用的迁移。
(2) 使用场景
  • 数据库版本管理。
  • 动态调整表结构。
  • 回滚变更。
  • 自动化部署。
(3) 底层原理
  • 迁移表:记录已应用的迁移。
  • SQL 语句生成:根据迁移方法生成对应的 SQL。
  • 事务支持:确保迁移过程的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值