Yii 数据库迁移
在开发基于数据库的应用程序时,数据库结构会随着源代码的改变而演变。Yii提供了 数据库迁移 功能,可以帮助您跟踪数据库的变化。
Yii提供以下迁移命令行工具:
- 创建新的数据库迁移
- 还原迁移
- 应用迁移
- 重新应用迁移
- 显示迁移状态和历史记录
创建迁移
让我们创建一个新的数据库迁移。
步骤1 - 在基本应用程序模板的项目根目录中打开控制台窗口并运行以下命令。
./yii migrate/create add_news_table
上面的命令将在 迁移 文件夹中创建一个新的迁移文件(在本例中为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() {
}
*/
}
?>
每个DB migration都是一个扩展于 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() 方法中删除了这个表。
news 表包含三个字段: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() - 删除外键