在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。
migrate的使用
进入项目的根目录,windows系统在当前根目录打开DOS命令行,以下所有的指令都是在这执行。
ps:如果windows8及以上的可以使用Windows Power Shell,使用Windows Power Shell执行指令时yii
指令应该写作.\yii
。
创建一个数据库迁移: yii migrate/create <name>
这是一个通用的创建数据迁移格式,其中<name>
是必填的参数,用来描述当前迁移。
ps:<name>
这个只能字母、数字、下划线,因为这个指令会生成一个迁移类,<name>
会不是这个类的类名的一部分。
举例说明,执行以下指令: .\yii migrate/create create_test_table
如图:
提示创建,填写yes。
m160623_034801_create_test_table.php
的内容:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
up方法用来编写改变数据库结构的代码;down方法中编写代码来恢复由up方法所做的改变。当使用migration升级数据库时,up方法会被调用,反之,down方法会被调用。 m160623_034801_create_test_table.php
的内容增加后:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
补充解释下以上的代码: $this->string(300)->notNull()
这样的代码指的是抽象定义字段类型,什么是抽象定义字段类型?就是说我并不直接写字段的类型,我只是写不同数据库中类似的字段定义。举个例子:
mysql数据库中有text
数据类型,用来存储大文本一类数据。而mssql数据库中并没有text
数据类型,但是有个类似的数据类型,叫做ntext
。如果在数据库迁移到mysql的时候直接写实体字段类型text
,那么如果改换数据库为mssql的时候就会很麻烦。使用抽象定义字段类型,就可以避免这个问题。他会根据你选择的数据库与定义的抽象字段类型灵活改变。
如下是所有这些数据库访问方法的列表:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
提交迁移:
可以执行如下: .\yii migrate
这个指令会提交所有的迁移
或者这样,指定类名,提交一个迁移 .\yii migrate m160623_034801_create_test_table
如图:
数据库中会出现一个叫做migration
的表,用来记录迁移记录,如图:
选中的就是当前迁移操作生成的记录。
会生成一个数据表test_table
并且插入一条数据。
还原迁移:
还原最近一次迁移: .\yii migrate/down
如图:
还原最近三次迁移: .\yii migrate/down 3
重做迁移:
重做迁移的意思是先还原指定的迁移,然后再次提交:
- 1
- 2
列出迁移
可以通过指令列出提交或者未提交的迁移:
- 1
- 2
- 3
- 4
- 5
- 6
- 7