Migration文件作用
migration 文件的主要作用就是用来管理数据库的结构,其实它是一组SQL语句的抽象化,migration 文件可以创建表,删除表,增加字段,删除字段等等基本上所有的数据库操作,其实这就像你自己手动写SQL语句一样,只不过在 migration 中你不需要手动的写SQL语句,只需要按照它的规则语法调用。
migrate 命令介绍
migrate:breakpoint 管理断点
migrate:create 创建一个迁移文件
migrate:rollback 回滚最后一个或特定的迁移
migrate:run 迁移数据库
migrate:status 显示迁移状态
1. Thinkphp5.1 使用 migration
thinkphp5 为开发者提供了一整套的 migration 解决方案,不过默认情况下 migration 是没有安装的,需要我们手动安装。将工作目录切换到tp5项目下,执行:
composer require topthink/think-migration v3.0.2
默认安装版本,更多版本地址: https://packagist.org/packages/topthink/think-migration
执行php think命令查看是否安装成功
2. create 命令
语法格式:php think migrate:create TableName
TableName 格式:首字母大写的驼峰法。该命令是用来创建一个 migration 文件,比如这里我们创建一个 Video 的 migration 文件:
php think migrate:create Video
在项目的根目录下多了一个 database 目录,有一个migration文件夹,该文件夹就是用来存放 migration文件,打开可以看到我们刚才创建的 Video 的 migration 文件:
created ./database/migrations/202305060932127_video.php
文件格式命名规则:时间 + 随机数 + _ + 文件名
文件创建好之后,来看下它的内容:
<?php
use think\migration\Migrator;
use think\migration\db\Column;
class Video 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()
{
}
}
这里我需要给我上面创建的 Video 文件增加字段
Video 表结构如下
字段 | 类型 | 说明 |
id | int | 主键 |
nickname | varchar(16) | 视频名称 |
varchar(32) | 邮箱 | |
password | varchar64) | 密码 |
删除默认自带的 change 方法,创建 up() 方法和 down() 方法。up() 方法是在执行 run 命令执行的,down() 是在执行 rollback 命令执行的。
<?php
use think\migration\Migrator;
use think\migration\db\Column;
class Video 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 up()
{
$table = $this->table('video');
$table->addColumn('name', 'string', ['limit' => 16, 'null' => false,'comment'=>'视频名称'])
->addColumn('email', 'string', ['limit' => 32, 'null' => false,'comment'=>'邮箱'])
->addColumn('password', 'string', ['limit' => 64, 'null' => false,'comment'=>'密码'])
->create();
}
public function down()
{
$this->dropTable('video');
}
}
这样,一个可以创建 video 表的 migration 文件就创建完毕了,接下来,来学习下一个命令。
3. migrate:run 命令
migration 文件创建完毕,还需要执行 run 命令才可以修改数据库:
注意,执行此步骤之前请正确配置了 config/database.php 。 在这里的数据库是有前缀的eb_
php think migrate:run
执行成功之后,查看数据库,多了两个表eb_migrations和eb_video
之前我定义了 migration 只指定了 nickname, email, password 三个字段,但是执行 run 命令创建的表中有四个字段,多了一个 id 主键?这是 thinkphp5 为我们默认添加的!小伙伴注意啦!如果你的主键字段名为 id 就不需要自己手动的指定了。
4. migrate:status 命令
说明:显示迁移状态
# php think migrate:status
Status Migration ID Started Finished Migration Name
----------------------------------------------------------------------------------
up 20230503032741 2023-05-06 17:12:50 2023-05-06 17:12:50 Video
5. migrate:roolback 命令
说明:回滚最后一个或特定的迁移
执行回滚操作
php think migrate:rollback
这时候查看数据库和表结构,数据库表已经被删除,不存在了
6. 新增表字段
对表进行二次操作,不能在同一个脚本中二次编辑,只能新建脚本。
下面给表eb_video增加新字段,重新生成表结构
php think migrate:create Video2
created ./database/migrations/202305060932127_video2.php
Video2 文件内容
<?php
use think\migration\Migrator;
class Video2 extends Migrator
{
public function up()
{
$table = $this->table('video');
$table->addColumn('upload_time', 'string', ['limit' => 11, 'null' => false,'comment'=>'上传时间'])
->addColumn('user_id', 'string', ['limit' => 11, 'null' => false,'comment'=>'上传用户ID'])
->save();
}
}
数据迁移
php think migrate:run