/ yii2

Yii2-migrations

数据库迁移

  • create new migrations;
  • apply migrations;
  • revert migrations;
  • re-apply migrations;
  • show migration history and status.

因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。

在 common/config/main.php 中配置好 Session、Log、authManager 组件:

生成 session 数据表:

./yii migrate --migrationPath=@yii/web/migrations/

生成日志需要用到的数据表:

./yii migrate --migrationPath=@yii/log/migrations/

生成 RBAC 需要用到的数据表:

./yii migrate --migrationPath=@yii/rbac/migrations/

Get Start

设置数据库连接参数 app/config/db.php

php yii
php yii migrate/up
php yii migrate/to m160313_153426_session_init.php -
-migrationPath=@yii/web/migrations/

Yii Migration Tool (based on Yii v2.0.12)

Creating migration history table "migration"...Done.
No new migrations found. Your system is up-to-date.

这会创建一张 migration 表。

Generating Migrations

创建一个 migration 名称是有一定规律的,例如:

./yii migrate/create create_表名_table
./yii migrate/create create_表名_table --fields="title:string,body:text"
./yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text"
./yii migrate/create drop_表名_table --fields="title:string(12):notNull:unique,body:text"

./yii migrate/create add_列名_column_to_表名_table --fields="列名:integer,列名2:string(30),列名3:char(7)"
./yii migrate/create drop_列名_column_from_表名_table --fields="列名1:integer,列名2:string(30),列名3:char(7)"

./yii migrate/create create_junction_table_for_表1名_and_表2名_tables --fields="created_at:dateTime"
./yii migrate/create create_post_table

./yii migrate/create create_post_talbe --fields="title:string(12):notNull:unique,body:text"

像这里,名称应该是 create_表名_table ,这样会自动生成代码,否则不会生成代码,这一点要注意。

在迁移类当中,你应当在 up() 方法中编写改变数据库结构的代码。 你可能还需要在 down() 方法中编写代码来恢复由 up() 方法所做的改变。


use yii\db\Schema;
use yii\db\Migration;

class m150101_185401_create_news_table extends \yii\db\Migration
{
    public function up()
    {
        $this->createTable('news', [
            'id' => $this->primaryKey(),
            'title' => $this->string()->notNull(),
            'content' => $this->text(),
        ]);
    }

    public function down()
    {
        $this->dropTable('news');
    }

}

注意: 并不是所有迁移都是可恢复的。例如,如果 up() 方法删除了表中的一行数据, 这将无法通过 down() 方法来恢复这条数据。有时候,你也许只是懒得去执行 down() 方法了, 因为它在恢复数据库迁移方面并不是那么的通用。在这种情况下, 你应当在 down() 方法中返回 false 来表明这个 migration 是无法恢复的。

再次运行提交迁移:

php yii migrate/up

这条命令会列出迄今为止所有未提交的迁移。如果你确定你需要提交这些迁移, 它将会按照类名当中的时间戳的顺序,一个接着一个的运行每个新的迁移类里面的 up() 或者是 safeUp() 方法。 如果其中任意一个迁移提交失败了, 那么这条命令将会退出并停止剩下的那些还未执行的迁移。

对于每一个成功提交的迁移,这条命令都会在一个叫做 migration 的数据库表中插入一条包含应用程序成功提交迁移的记录, 该记录将帮助迁移工具判断哪些迁移已经提交,哪些还没有提交。

查看下数据表 migration:

mysql> select * from migration;

还原最近一次迁移:

php yii migrate/down

这会执行我们新建的所有 migration 中的 safedown 方法。这里会删除我们刚刚建立的 orders 表。再次查看数据表,就会发现 orders 表已经不见了。

关于数据类型,参考文档 yii-db-schemayii\db\mysql\Schema

Yii2 支持两种方式来声明数据列的 Schema。我们可以直接使用 Schema 类定义的常量,或者用 native migration methods,例如 primaryKey(),integer(),string() 和 text() 等。

最佳实践,使用 yii\db\Migration 提供的 primaryKey(),integer(),string() 方法。不要使用
yii\db\mysql\Schema

补充材料: