Yii2之数据库迁移(Migrate)

在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,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的内容:

<?php

use yii\db\Migration;

/**
 * Handles the creation for table `test_table`.
 */
class m160623_034801_create_test_table extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('test_table', [
            'id' => $this->primaryKey(),
        ]);
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        $this->dropTable('test_table');
    }
}

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

<?php

use yii\db\Migration;

/**
 * Handles the creation for table `test_table`.
 */
class m160623_034801_create_test_table extends Migration
{
    /**
     * 改变数据表结构方法
     * @inheritdoc
     */
    public function up()
    {
        //创建数据表test_table并且定义表中字段
        $this->createTable('test_table', [
            //`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
            'id' => $this->primaryKey(),
            //`title` varchar(300) not null
            'title' => $this->string(300)->notNull(),
            //`content` text
            'content' => $this->text(),
            // `create_time` datetime
            'create_time' => $this->dateTime(),
        ]);

        //插入一条数据
        $this->insert('test_table',[
            'id' => 1,
            'title' => '哆啦A梦',
            'content' => '大雄'
        ]);
    }

    /**
     * 还原数据表改动的方法
     * 执行顺序要与up方法内部操作顺序相反
     * @inheritdoc
     */
    public function down()
    {
        //删除一条数据
        $this->delete('test_table',[
            'id' => 1
        ]);
        //drop掉整个表
        $this->dropTable('test_table');
    }
}

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

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

yii\db\Migration::execute(): 执行一条 SQL 语句
yii\db\Migration::insert(): 插入单行数据
yii\db\Migration::batchInsert(): 插入多行数据
yii\db\Migration::update(): 更新数据
yii\db\Migration::delete(): 删除数据
yii\db\Migration::createTable(): 创建表
yii\db\Migration::renameTable(): 重命名表名
yii\db\Migration::dropTable(): 删除一张表
yii\db\Migration::truncateTable(): 清空表中的所有数据
yii\db\Migration::addColumn(): 加一个字段
yii\db\Migration::renameColumn(): 重命名字段名称
yii\db\Migration::dropColumn(): 删除一个字段
yii\db\Migration::alterColumn(): 修改字段
yii\db\Migration::addPrimaryKey(): 添加一个主键
yii\db\Migration::dropPrimaryKey(): 删除一个主键
yii\db\Migration::addForeignKey(): 添加一个外键
yii\db\Migration::dropForeignKey(): 删除一个外键
yii\db\Migration::createIndex(): 创建一个索引
yii\db\Migration::dropIndex(): 删除一个索引

提交迁移:

可以执行如下: .\yii migrate 这个指令会提交所有的迁移 或者这样,指定类名,提交一个迁移 .\yii migrate m160623_034801_create_test_table 如图:

数据库中会出现一个叫做migration的表,用来记录迁移记录,如图:

选中的就是当前迁移操作生成的记录。 会生成一个数据表test_table并且插入一条数据。

还原迁移:

还原最近一次迁移: .\yii migrate/down 如图:

还原最近三次迁移: .\yii migrate/down 3

重做迁移:

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

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

列出迁移

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

.\yii migrate/history  #显示最近10次提交的迁移
.\yii migrate/history 6 #显示最近5次提交的迁移
.\yii migrate/history all #显示所有的提交迁移

.\yii migrate/new #显示最近10次未提交的迁移
.\yii migrate/new 6 #显示最近6次未提交的迁移
.\yii migrate/new all #显示所有的未提交迁移

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Super 前端

HTML5-创建HTML文档

HTML5中的一个主要变化是:将元素的语义与元素对其内容呈现结果的影响分开。从原理上讲这合乎情理。HTML元素负责文档内容的结构和含义,内容的呈现则由应用于元素...

16940
来自专栏Super 前端

HTML5-嵌入内容

img元素允许我们在HTML文档里嵌入图像。图像在HTML标记处理完毕后才加载!!

17650
来自专栏Super 前端

HTML5-输入验证

HTML5引入了对输入验证的支持。设计者可告知浏览器自己需要什么类型的数据,然后浏览器在提交表单之前会使用这些信息检查用户输入的数据是否有效。其好处是:用户可以...

25650
来自专栏Super 前端

【HTTP】客户端识别与cookie机制

​ 然而,大多数产品都希望提供一个类“免责声明”的文档,然后主动管理该DNT。所以我们只能借助其他方式(这里常用的方式是第三方Cookie,见文档Co...

9450
来自专栏WebJ2EE

Spring入门:Resource

然而,用 Java 的 File、URL 访问这些底层资源的步骤过于繁琐。Spring 为资源访问提供了一个 Resource 接口,该接口提供了更强的资源访问...

12920
来自专栏DotNet Core圈圈

Microsoft REST API指南

经过3个月的碎片时间的翻译和校验,由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南 》已经翻译完成,现刊载前十一章如下...

17910
来自专栏Super 前端

JavaScript日期处理

​ 当然,Github上提供了好多优秀的日期处理插件(如:Datejs、date-fns、jquery-dateFormat),然而当处理一些简单的日期操作...

24840
来自专栏Super 前端

BOM

BOM(浏览器对象模型)提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。

7140
来自专栏Super 前端

HTML5-表单

当使用form提交数据时:在HTML4中,input、button和其他与表单相关的元素必须放在form元素中;在HTML5中,这条限制不复存在。可以将这类元素...

28750
来自专栏Super 前端

[NodeJS]创建HTTP、HTTPS服务器与客户端

当从客户端请求流中读取到数据时会触发data事件,当读取完客户端请求流中的数据时触发end事件。

22730

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励