在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。

migrate的使用

进入项目的根目录,windows系统在当前根目录打开DOS命令行,以下所有的指令都是在这执行。
ps:如果windows8及以上的可以使用Windows Power Shell,使用Windows Power Shell执行指令时yii指令应该写作.\yii。
创建一个数据库迁移:
yii migrate/create <name>

这是一个通用的创建数据迁移格式,其中是必填的参数,用来描述当前迁移。
ps:<name>这个只能字母、数字、下划线,因为这个指令会生成一个迁移类,会不是这个类的类名的一部分。
举例说明,执行以下指令:
.\yii migrate/create create_test_table
如图:
Yii2之数据库迁移(Migrate) - 图1
提示创建,填写yes。
Yii2之数据库迁移(Migrate) - 图2
m160623_034801_create_test_table.php的内容:

  1. <?php
  2. use yii\db\Migration;
  3. /**
  4. * Handles the creation for table `test_table`.
  5. */
  6. class m160623_034801_create_test_table extends Migration
  7. {
  8. /**
  9. * @inheritdoc
  10. */
  11. public function up()
  12. {
  13. $this->createTable('test_table', [
  14. 'id' => $this->primaryKey(),
  15. ]);
  16. }
  17. /**
  18. * @inheritdoc
  19. */
  20. public function down()
  21. {
  22. $this->dropTable('test_table');
  23. }
  24. }

up方法用来编写改变数据库结构的代码;down方法中编写代码来恢复由up方法所做的改变。当使用migration升级数据库时,up方法会被调用,反之,down方法会被调用。
m160623_034801_create_test_table.php的内容增加后:

  1. <?php
  2. use yii\db\Migration;
  3. /**
  4. * Handles the creation for table `test_table`.
  5. */
  6. class m160623_034801_create_test_table extends Migration
  7. {
  8. /**
  9. * 改变数据表结构方法
  10. * @inheritdoc
  11. */
  12. public function up()
  13. {
  14. //创建数据表test_table并且定义表中字段
  15. $this->createTable('test_table', [
  16. //`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
  17. 'id' => $this->primaryKey(),
  18. //`title` varchar(300) not null
  19. 'title' => $this->string(300)->notNull(),
  20. //`content` text
  21. 'content' => $this->text(),
  22. // `create_time` datetime
  23. 'create_time' => $this->dateTime(),
  24. ]);
  25. //插入一条数据
  26. $this->insert('test_table',[
  27. 'id' => 1,
  28. 'title' => '哆啦A梦',
  29. 'content' => '大雄'
  30. ]);
  31. }
  32. /**
  33. * 还原数据表改动的方法
  34. * 执行顺序要与up方法内部操作顺序相反
  35. * @inheritdoc
  36. */
  37. public function down()
  38. {
  39. //删除一条数据
  40. $this->delete('test_table',[
  41. 'id' => 1
  42. ]);
  43. //drop掉整个表
  44. $this->dropTable('test_table');
  45. }
  46. }

补充解释下以上的代码:
$this->string(300)->notNull()这样的代码指的是抽象定义字段类型,什么是抽象定义字段类型?就是说我并不直接写字段的类型,我只是写不同数据库中类似的字段定义。举个例子:
mysql数据库中有text数据类型,用来存储大文本一类数据。而mssql数据库中并没有text数据类型,但是有个类似的数据类型,叫做ntext。如果在数据库迁移到mysql的时候直接写实体字段类型text,那么如果改换数据库为mssql的时候就会很麻烦。使用抽象定义字段类型,就可以避免这个问题。他会根据你选择的数据库与定义的抽象字段类型灵活改变。

如下是所有这些数据库访问方法的列表:

  1. yii\db\Migration::execute(): 执行一条 SQL 语句
  2. yii\db\Migration::insert(): 插入单行数据
  3. yii\db\Migration::batchInsert(): 插入多行数据
  4. yii\db\Migration::update(): 更新数据
  5. yii\db\Migration::delete(): 删除数据
  6. yii\db\Migration::createTable(): 创建表
  7. yii\db\Migration::renameTable(): 重命名表名
  8. yii\db\Migration::dropTable(): 删除一张表
  9. yii\db\Migration::truncateTable(): 清空表中的所有数据
  10. yii\db\Migration::addColumn(): 加一个字段
  11. yii\db\Migration::renameColumn(): 重命名字段名称
  12. yii\db\Migration::dropColumn(): 删除一个字段
  13. yii\db\Migration::alterColumn(): 修改字段
  14. yii\db\Migration::addPrimaryKey(): 添加一个主键
  15. yii\db\Migration::dropPrimaryKey(): 删除一个主键
  16. yii\db\Migration::addForeignKey(): 添加一个外键
  17. yii\db\Migration::dropForeignKey(): 删除一个外键
  18. yii\db\Migration::createIndex(): 创建一个索引
  19. yii\db\Migration::dropIndex(): 删除一个索引

提交迁移:

可以执行如下:
.\yii migrate
这个指令会提交所有的迁移
或者这样,指定类名,提交一个迁移
.\yii migrate m160623_034801_create_test_table
如图:
Yii2之数据库迁移(Migrate) - 图3

数据库中会出现一个叫做migration的表,用来记录迁移记录,如图:
Yii2之数据库迁移(Migrate) - 图4
选中的就是当前迁移操作生成的记录。
会生成一个数据表test_table并且插入一条数据。
Yii2之数据库迁移(Migrate) - 图5

还原迁移:

还原最近一次迁移:
.\yii migrate/down
如图:
Yii2之数据库迁移(Migrate) - 图6
还原最近三次迁移:
.\yii migrate/down 3

重做迁移:

重做迁移的意思是先还原指定的迁移,然后再次提交:

  1. .\yii migrate/redo ##重做最近一次提交的迁移
  2. .\yii migrate/redo 3 ##重做最近三次提交的迁移

列出迁移

可以通过指令列出提交或者未提交的迁移:

  1. .\yii migrate/history #显示最近10次提交的迁移
  2. .\yii migrate/history 6 #显示最近5次提交的迁移
  3. .\yii migrate/history all #显示所有的提交迁移
  4. .\yii migrate/new #显示最近10次未提交的迁移
  5. .\yii migrate/new 6 #显示最近6次未提交的迁移
  6. .\yii migrate/new all #显示所有的未提交迁移


————————————————
版权声明:本文为CSDN博主「高玉龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gao_yu_long/article/details/51742082