Yii - 数据库迁移
在开发数据库驱动的应用程序时,数据库结构会随着源代码而演变。Yii 提供了数据库迁移功能,可让您跟踪数据库更改。
Yii 提供了以下迁移命令行工具 −
- 创建新迁移
- 还原迁移
- 应用迁移
- 重新应用迁移
- 显示迁移状态和历史记录
创建迁移
让我们创建一个新的数据库迁移。
步骤 1 −在基本应用程序模板的项目根目录中打开控制台窗口并运行。
./yii migration/create add_news_table
上述命令将在 migrations 文件夹中创建一个新的迁移文件(本例中为 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."; return false; } /* // 使用 safeUp/safeDown 在事务中运行迁移代码 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'); } /* // 使用 safeUp/safeDown 在事务中运行迁移代码 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 move 3
步骤 5 −您还可以定义数据库应迁移到的特定迁移。
# 使用时间戳指定迁移
yii move/to 160202_195501
# 使用可由 strtotime() 解析的字符串
yii move/to "2016-01-01 19:55:01"
# 使用全名
yii move/to m160202_195501_create_news_table
# 使用 UNIX 时间戳
yii move/to 1393964718
步骤 6 − 要恢复迁移(执行 down() 或 safeDown() 方法),请运行。
./yii move/down
步骤 7 − 要恢复最近应用的五个迁移,您可以运行。
./yii move/down 5
步骤 8 −要重做(恢复然后再次应用)迁移,请运行。
./yii move/redo
要列出已应用的迁移,请使用以下命令 −
yii move/new # 显示前 10 个新迁移
yii move/new 3 # 显示前 3 个新迁移
yii move/new all # 显示所有新迁移迁移
yii move/history # 显示最后 10 次应用的迁移
yii move/history 20 # 显示最后 20 次应用的迁移
yii move/history all # 显示所有应用的迁移
有时您需要从特定表中添加或删除列。您可以使用 addColumn() 和 dropColumn() 方法。
步骤 1 −创建新的迁移。
./yii migration/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 move,则类别列应添加到新闻表中。相反,如果您运行 ./yii move/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() − 删除外键