📜  Yii-数据库迁移

📅  最后修改于: 2020-10-16 07:25:16             🧑  作者: Mango


在开发数据库驱动的应用程序期间,数据库结构随源代码一起发展。 Yii提供了数据库迁移功能,可让您跟踪数据库更改。

Yii提供以下迁移命令行工具-

  • 创建新的迁移
  • 还原迁移
  • 应用迁移
  • 重新应用迁移
  • 显示迁移状态和历史记录

创建迁移

让我们创建一个新的数据库迁移。

步骤1-在基本应用程序模板的项目根目录内,打开控制台窗口并运行。

./yii migrate/create add_news_table

上面的命令将在migrations文件夹中创建一个新的迁移文件(在本例中为m160113_102634_add_news_table.php)。

该文件包含以下代码-


每个数据库迁移都是一个PHP类,扩展了yii \ db \ Migration类。类名以以下格式生成-

m_

其中是执行迁移命令的UTC日期时间,而是您在控制台命令中提供的参数。

在升级数据库时,将调用up()方法,而在降级数据库时,将调用down()方法。

步骤2-要将新表添加到数据库,请以这种方式修改迁移文件。

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,标题和内容。创建表或列时,我们应使用抽象类型,以便迁移独立于数据库类型。例如,对于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 migration / new #显示前10个新迁移

  • yii migration / new 3 #显示前3个新迁移

  • yii migration / new all #显示所有新的迁移

  • yii migration / history #显示最近进行的10次迁移

  • yii migration / history 20 #显示最近进行的20次迁移

  • yii migration / history all #显示所有已应用的迁移

有时您需要在特定表中添加或删除列。您可以使用addColumn()dropColumn()方法。

步骤1-创建一个新的迁移。

./yii migrate/create add_category_to_news

步骤2-以这种方式修改新创建的迁移文件。

addColumn('news', 'category', $this->integer());
      }
      public function down() {
         $this->dropColumn('news', 'category');
      }
   }
?>

现在,如果您运行./yii migration ,则应该将类别列添加到新闻表中。相反,如果运行./yii migration / down 1 ,则应该删除类别列。

执行数据库迁移时,重要的是确保每个迁移都成功或失败。建议将数据库操作包含在事务中。要实现事务性迁移,您只需将迁移代码放入safeUp()safeDown()方法中。如果这些方法中的任何操作失败,则将回滚所有先前的操作。

之前的“交易方式”示例为-

addColumn('news', 'category', $this->integer());
      }
      public function safeDown() {
         $this->dropColumn('news', 'category');
      }
   }
?>

yii \ db \ Migration类提供以下用于操作数据库的方法-

  • execute() -执行原始SQL语句

  • createTable() -创建一个表

  • namedTable() -重命名表

  • insert() -插入一行

  • batchInsert() -插入多行

  • update() -更新行

  • delete() -删除行

  • addColumn() -添加一列

  • namedColumn() -重命名列

  • dropColumn() -删除列

  • alterColumn() -更改列

  • dropTable() -删除表

  • truncateTable() -删除表中的所有行

  • createIndex() -创建一个索引

  • dropIndex() -删除索引

  • addPrimaryKey() -添加一个主键

  • dropPrimaryKey() -删除主键

  • addForeignKey() -添加外键

  • dropForeignKey() -删除外键