Yii提供以下迁移命令行工具-
创建新的迁移
恢复迁移
应用迁移
重新申请迁移
显示迁移状态和历史记录
创建迁移
现在创建一个新的数据库迁移。
第1步-在基本应用程序模板项目根目录内打开控制台窗口并运行。
c:>baisc> yii migrate/create add_news_table
上面的命令将在migrations文件夹中创建的新的迁移文件(本示例中生成的是:m160605_040139_add_news_table.php)。
该文件包含下面的代码-
每个数据迁移是扩展了yiidbMigration类的PHP类。类名是按以下格式生成的-
m_
其中是指迁移命令被执行的UTC日期时间和是在控制台命令提供的参数。
当升级数据库时up()方法被调用,而当降级时down()方法被调用。
第2步-对新表添加到数据库,使用以下方式来修改migration文件。
<?php use yiidbSchema; use yiidbMigration; class m160605_040139_add_news_tableextends 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)NOTNULAUTO_INCREMETNPRIMARYKEY。
第3步-升级数据库,运行此命令。
c:>basic> yii migrate
上面的命令将列出尚未提交过的所有可用的应用迁移。然后,如果确认提交迁移,它将在所有新的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 yiidbSchema; use yiidbMigration; 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'); } } ?>
现在,如果运行yiimigrate,category字段列应该被添加到news表中。
相反,如果运行yiimigrate/down1,category字段栏应被丢弃(删除)。
当执行数据库迁移,重要的是要确保每个迁移成功或失败。建议在数据库操作中使用事务处理。要实现事务迁移,需要把迁移代码放在safeUp()和safeDown()方法中。如果这些方法中的任何操作失败,所有以前的操作将被回滚。
在之前的实例中,使用“事务方式”如下所示:
<?php use yiidbSchema; use yiidbMigration; 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'); } } ?>
yiidbMigration类为操作数据库提供了下面的方法-
execute()−执行原始的SQL语句
createTable()− 创建一个表
renameTable()− 重命名表
insert()− 插入一行
batchInsert()− 插入多行
update()− 更新多行
delete()− 删除多行
addColumn()− 添加一列
renameColumn()− 重命名一列
dropColumn()− 删除一列
alterColumn()− 修改一列
dropTable()− 删除一个表
truncateTable()−删除表中的所有行
createIndex()− 创建一个索引
dropIndex()− 删除一个索引
addPrimaryKey()− 添加主键
dropPrimaryKey()−删除主键
addForeignKey()−添加一个外键
dropForeignKey()−删除一个外键