Yii - 数据库迁移

  • 简述

    在开发数据库驱动的应用程序期间,数据库结构随着源代码的发展而演变。Yii 提供了数据库迁移功能,允许您跟踪数据库更改。
    Yii 提供以下迁移命令行工具 -
    • 创建新的迁移
    • 还原迁移
    • 应用迁移
    • 重新应用迁移
    • 显示迁移状态和历史
  • 创建迁移

    让我们创建一个新的数据库迁移。
    第 1 步 - 在基本应用程序模板的项目根目录中打开控制台窗口并运行。
    
    ./yii migrate/create add_news_table
    
    上述命令将在migration文件夹中创建一个新的迁移文件(在本例中为 m160113_102634_add_news_table.php)。
    该文件包含以下代码 -
    
    <?php
       use yii\db\Schema;
       use yii\db\Migration;
       class m160113_102634_add_news_table extends Migration {
          public function up() {
       
          }
          public function down() {
             echo "m160113_102634_add_news_table cannot be reverted.\n";
             return false;
          }
          /*
          // Use safeUp/safeDown to run migration code within a transaction
          public function safeUp() {
     
          }
          public function safeDown() {
       
          }
          */
       }
    ?>
    
    每个数据库迁移都是一个扩展yii\db\Migration类的 PHP类。类名以以下格式生成 -
    
    m<YYMMDD_HHMMSS>_<Name>
    
    其中<YYMMDD_HMMSS>是执行迁移命令的 UTC 日期时间,<Name> 是您在控制台命令中提供的参数。
    升级数据库时调用 up() 方法,降级时调用 down() 方法。
    第 2 步 - 要将新表添加到数据库,请以这种方式修改迁移文件。
    
    <?php
       use yii\db\Schema;
       use yii\db\Migration;
       class m160113_102634_add_news_table extends Migration {
          public function up() {
             $this->createTable("news", [
                "id" => Schema::TYPE_PK,
                "title" => Schema::TYPE_STRING,
                "content" => Schema::TYPE_TEXT,
             ]);
          }
          public function down() {
             $this->dropTable('news');
          }
          /*
          // Use safeUp/safeDown to run migration code within a transaction
          public function safeUp() {
         
          }
          public function safeDown() {
          }
          */
       }
    ?>
    
    在上面的代码中,我们在 up() 方法中创建了一个名为 news 的新表,并在down()方法中删除了这个表。
    新闻表由三个字段组成:id、title 和 content。创建表或列时,我们应该使用抽象类型,以便迁移独立于数据库类型。例如,在 MySQL 的情况下,TYPE_PK 将被转换为 int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY。
    第 3 步 - 要升级数据库,请运行此命令。
    
    ./yii migrate
    
    升级数据库
    上述命令将列出所有尚未应用的可用迁移。然后,如果您确认应用迁移,它将在所有新的迁移类中运行 safeUp() 或 up()。
    第 4 步 - 要仅应用三个可用的迁移,您可以运行。
    
    ./yii migrate 3
    
    第 5 步 - 您还可以定义数据库应该迁移到的特定迁移。
    # 使用时间戳指定迁移
    
    yii migrate/to 160202_195501
    
    # 使用可以被 strtotime() 解析的字符串
    
    yii migrate/to "2016-01-01 19:55:01"
    
    # 使用全名
    
    yii migrate/to m160202_195501_create_news_table
    
    # 使用 UNIX 时间戳
    
    yii migrate/to 1393964718
    
    第 6 步- 要恢复迁移(执行 down() 或 safeDown() 方法),请运行。
    
    ./yii migrate/down
    
    恢复迁移
    第 7 步 - 要恢复最近应用的五个迁移,您可以运行。
    
    ./yii migrate/down 5
    
    第 8 步- 要重做(还原然后再次应用)迁移,请运行。
    
    ./yii migrate/redo
    
    重做迁移
    要列出已应用的迁移,请使用以下命令 -
    • yii migrate/new # 显示前 10 个新迁移
    • yii migrate/new 3 # 显示前 3 个新迁移
    • yii migrate/new all # 显示所有新的迁移
    • yii migrate/history # 显示最近 10 个应用的迁移
    • yii migrate/history 20 # 显示最近 20 个应用的迁移
    • yii migrate/history all # 显示所有应用的迁移
    有时您需要从特定表中添加或删除列。您可以使用addColumn()dropColumn()方法。
    第 1 步 - 创建一个新的迁移。
    
    ./yii migrate/create add_category_to_news
    
    第 2 步 - 以这种方式修改新创建的迁移文件。
    
    <?php
       use yii\db\Schema;
       use yii\db\Migration;
       class m160113_110909_add_category_to_news extends Migration {
          public function up() {
             $this->addColumn('news', 'category', $this->integer());
          }
          public function down() {
             $this->dropColumn('news', 'category');
          }
       }
    ?>
    
    现在,如果你运行./yii migrate,类别列应该被添加到新闻表中。相反,如果您运行./yii migrate/down 1,则应该删除类别列。
    执行数据库迁移时,确保每次迁移成功或失败非常重要。建议将数据库操作包含在事务中。要实现事务迁移,您只需将迁移代码放在safeUp()safeDown()方法中。如果这些方法中的任何操作失败,则之前的所有操作都将回滚。
    “交易方式”中的前一个示例将是 -
    
    <?php
       use yii\db\Schema;
       use yii\db\Migration;
       class m160113_110909_add_category_to_news extends Migration {
          public function safeUp() {
             $this->addColumn('news', 'category', $this->integer());
          }
          public function safeDown() {
             $this->dropColumn('news', 'category');
          }
       }
    ?>
    
    yii\db\Migration类提供了以下操作数据库的方法-
    • execute() - 执行原始 SQL 语句
    • createTable() - 创建一个表
    • renameTable() - 重命名表
    • insert() - 插入单行
    • batchInsert() - 插入多行
    • update() - 更新行
    • delete() - 删除行
    • addColumn() - 添加一列
    • renameColumn() - 重命名列
    • dropColumn() - 删除一列
    • alterColumn() - 改变一列
    • dropTable() - 删除一个表
    • truncateTable() - 删除表中的所有行
    • createIndex() - 创建一个索引
    • dropIndex() - 删除索引
    • addPrimaryKey() - 添加主键
    • dropPrimaryKey() - 删除主键
    • addForeignKey() - 添加外键
    • dropForeignKey() - 删除外键