ThinkPHP think-migration 数据迁移从零开始使用

一、安装最新的 ThinkPHP

详情见官方手册:https://www.kancloud.cn/manual/thinkphp6_0/1037481
我这边使用 Composer 方式进行安装,以项目 tp 为目录

composer create-project topthink/think tp

配置数据库连接。tp/.env 文件,默认可以先将项目创建完成后根目录里面的 .env.sample 文件复制一份并改名为 .env 打开此文件

APP_DEBUG=true

[APP]
DEFAULT_TIMEZONE=Asia/Shanghai

[DATABASE]
TYPE=mysql
HOSTNAME=127.0.0.1
DATABASE=test
USERNAME=root
PASSWORD=123456
HOSTPORT=3306
CHARSET=utf8
DEBUG=true

请确保数据库存在并且连接成功

二、基于 ThinkPHP 安装数据迁移插件

thinkphp6 数据库迁移工具,进入到项目目录 tp 下面,打开命令行工具执行安装数据迁移文件

composer require topthink/think-migration

三、创建迁移文件

新增迁移文件, 进入到项目指定项目的根目录,这里创建一个迁移文件,文件名称必须要使用大驼峰进行命名,如你需要创建一个 test 数据表,那么建议使用 TestCreate 名称进行定义,这样可以很清楚知道这个数据迁移文件是用来做创建 test 数据表相关的定义的。当然并不是一定要这样进行命名,也可以随意使用其他方式,只是为了方便见名知意。

php think migrate:create TestCreate

执行上面命令会在项目目录下自动生成 tp/databases/migrations/20220820065413_test_create.php 文件。当前文件名前面的像日期时间的数字表示是当前生成此文件的时间年月日时分秒的数字。后面是文件名

四、创建迁移文件

官方插件没给详细的迁移文件内容语法,比如简单和随意,think-migration 是基于 phinx,所以手册可以查看 phinx 官方的手册。

  1. thinkphp-migration官方手册
  2. phinx 官方手册
  3. 大佬基于 phinx 翻译出的中文手册,将就着看

这里基于我刚刚上面创建的一个数据迁移文件 tp/databases/migrations/20220820065413_test_create.php ,进行一个简单的案例编写

 <?php

use Phinx\Db\Adapter\MysqlAdapter;
use think\migration\Migrator;
use think\migration\db\Column;

class TestCreate extends Migrator
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        $table = $this->table('test',['engine'=>'innodb','charset'=>'utf8mb4','auto_increment'=>true,'comment'=>'测试案例表']);
        $table
            ->addColumn('username','string',['limit'=>60,'null'=>false,'default'=>'','comment'=>'用户名'])
            ->addColumn('password','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'密码'])
            ->addColumn('salt','string',['limit'=>32,'null'=>false,'default'=>'','comment'=>'密码盐'])
            ->addColumn('real_name','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'真实姓名'])
            ->addColumn('avatar','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'头像'])
            ->addColumn('desc','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'描述'])
            ->addColumn('role_id','integer',['limit'=>11,'signed'=>false,'null'=>false,'default'=>0,'comment'=>'角色组id'])
            ->addColumn('phone','string',['limit'=>20,'null'=>false,'default'=>'','comment'=>'手机'])
            ->addColumn('email','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'邮箱'])
            ->addColumn('extension','json',['null'=>true,'default'=>null,'comment'=>'扩展信息'])
            ->addColumn('sort','integer',['limit'=>MysqlAdapter::INT_TINY,'null'=>false,'default'=>1,'comment'=>'排序0-255(越小越前)'])
            ->addColumn('status','integer',['limit'=>MysqlAdapter::INT_TINY,'null'=>false,'default'=>1,'comment'=>'状态:为1正常,为0禁用'])
            ->addColumn('login_ip','string',['limit'=>128,'null'=>false,'default'=>'','comment'=>'最近登录IP'])
            ->addColumn('create_time','integer',['limit'=>11,'signed'=>false,'null'=>false,'default'=>0,'comment'=>'创建时间'])
            ->addColumn('update_time','integer',['limit'=>11,'signed'=>false,'null'=>false,'default'=>0,'comment'=>'更新时间'])
            ->setPrimaryKey('id')
            ->addIndex('id')
            ->addIndex('username')
            ->addIndex('real_name')
            ->create();
    }
}

五、执行

回到项目根目录 tp 目录下,在终端里面运行如下命令

php think migrate:run

运行成功后会在数据表里面存在一个 test 的数据表。