Yii数据库迁移

在开发数据库驱动应用程序的过程中,源代码转成数据库结构。 Yii提供了数据库迁移功能,可以让您跟踪数据库更改。
Yii提供以下迁移命令行工具 -
  • 创建新的迁移
  • 恢复迁移
  • 应用迁移
  • 重新申请迁移
  • 显示迁移状态和历史记录

创建迁移

现在创建一个新的数据库迁移。
第1步 - 在基本应用程序模板项目根目录内打开控制台窗口并运行。
c:>baisc> yii migrate/create add_news_table
上面的命令将在migrations文件夹中创建的新的迁移文件(本示例中生成的是:m160605_040139_add_news_table.php)。
该文件包含下面的代码 -
<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160605_040139_add_news_table extends Migration { public function up() {
   
      }
      public function down() {
         echo "m160605_040139_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步 - 对新表添加到数据库,使用以下方式来修改 migration 文件。
<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160605_040139_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() {

      }
      */
   }
?>
在上面的代码中,我们创建了一个 news 的新表在 up()方法,并在 down()方法删除此表。
该 news 表由三个字段组成:id, title 和 content 。 当创建一个表或列,我们应该用抽象类型以便迁移时它转为数据库的类型。例如,在 MySQL 中,TYPE_PK将被转换成 int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY。
第3步 - 升级数据库,运行此命令。
c:\>basic> yii migrate
Yii数据库迁移
上面的命令将列出尚未提交过的所有可用的应用迁移。然后,如果确认提交迁移,它将在所有新的 migration 类中运行 safeUp()或 up()。
第4步 - 只有三个可用的迁移可以提交运行。
c:\>basic> yii migrate 3
第5步 - 也可以定义一个特定迁移将数据库迁移。

# 使用时间戳来指定迁移

c:\>basic> yii migrate/to 160606_105608

# 使用能够通过 strtotime() 来解析的字符串。

c:\>basic> yii migrate/to "2016-06-06 19:35:21"

# 使用全名

c:>basic> yii migrate/to m160606_193521_create_news_table

# 使用 UNIX timestamp

c:\basic> yii migrate/to 1399964718
第6步 - 要恢复迁移(执行 down() 或safeDown()方法)并运行。
c:\basic> yii migrate/down
第7步 - 只能最多恢复5个最近使用的应用的迁移,可以运行以下命令:
c:\>basic> yii migrate/down 5

第8步- 要重做(恢复,然后重新提交)迁移,运行。
c:\basic> 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步 - 创建一个新的迁移。
c:\>basic> yii migrate/create add_category_to_news
第2步 - 修改新创建的 migration 文件并使用以下代码。
<?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,category 字段列应该被添加到 news 表中。
相反,如果运行 yii migrate/down 1 ,category 字段栏应被丢弃(删除)。

当执行数据库迁移,重要的是要确保每个迁移成功或失败。建议在数据库操作中使用事务处理。要实现事务迁移,需要把迁移代码放在 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() − 删除一个外键


上一篇: Yii活动记录(Active Record) 下一篇: Yii主题化