ThinkPHP渣男的道

THINKPHP5 的数据迁移工具

2018-10-10  本文已影响111人  a564c12b3104

THINKPHP5 的数据迁移工具

migration 数据迁移的主要作用

数据迁移就像是数据库的版本控制,可以避免手动修改数据库导致的冲突问题,确保项目团队轻松修改并保持应用程序的数据库结构的一致性。 数据迁移的主要作用就是用来管理数据库的结构,其实它是一组SQL语句的抽象化,数据迁移文件可以创建表,删除表,增加字段,删除字段等等基本上所有的数据库操作,其实这就像你自己手动写SQL语句一样,只不过在数据迁移文件中你不需要手动的写SQL语句,只需要按照它的规则语法调用一下就可以啦。

thinkphp5 中安装:

thinkphp5 为开发者提供了一整套的 migration 解决方案,不过默认情况下 migration 是没有安装的,需要我们手动安装。

composer require topthink/think-migration

在执行 php think 时会多出

 migrate
  migrate:breakpoint  Manage breakpoints
  migrate:create      Create a new migration
  migrate:rollback    Rollback the last or to a specific migration
  migrate:run         Migrate the database
  migrate:status      Show migration status
 seed
  seed:create         Create a new database seeder
  seed:run            Run database seeders

migrate 命令介绍:

  1. migrate:breakpoint 管理断点
  2. migrate:create 创建一个迁移文件
  3. migrate:rollback 回滚最后一个或特定的迁移
  4. migrate:run 迁移数据库
  5. migrate:status 显示迁移状态

seed 命令介绍:

  1. seed:create 创建一个数据库填充程序
  2. seed:run 执行数据库填充

migrate:create 创建数据迁移文件:

php think migrate:create CreateUserTable

CreateUserTable 首字母大写的驼峰法。执行后,会在项目根目录下的database/migrations目录下创建一个迁移文件。

打开生成的迁移文件会看到默认有一个 change 方法,删除自带的 change 方法,创建 up() 方法和 down() 方法。up() 是在执行 run 命令执行的,down() 是在执行 rollback 命令执行的。

请注意,当change存在方法时,会自动忽略updown方法

migrate:run 运行所有迁移文件

php think migrate:run
//指定版本
php think migrate:run -t 20120103083322

migrate:rollback 回滚,可一个或多个

php think migrate:rollback
//指定版本
php think migrate:rollback -t 20120103083322
//回滚所有
php think migrate:rollback -t 0

migrate:breakpoint 设置断点

php think migrate:breakpoint
//指定版本
php think migrate:breakpoint -t 20120103083322

作用:如果设置了断点,最多只可以回滚到断点处,强制回滚除外。如果想取消断点,在执行一次php think migrate:breakpoint就可以了

migrate:status 显示迁移状态

php think migrate:status

迁移文件的编写

迁移文件创建好后,需要根据需求修改里面的内容,才可以达到我们想要的目的。
创建一个新的迁移文件,并删除自带的 change 方法,创建 up() 方法和 down() 方法。

<?php

use think\migration\Migrator;
use think\migration\db\Column;

class CreateJjsTable extends Migrator
{
    // migrate:run 时执行
    public function up()
    {
      // 迁移方法
    }

    // migrate:rollback 时执行
    public function down()
    {
      // 回滚方法
    }
}

方法列举(不一定全):

public function up()
{
    $count = $this->execute('DELETE FROM users'); // execute()方法返回受影响的行数

    //query()方法将结果作为PDOStatement返回,fetchAll()方法对query返回的数据以数组的形式返回结果
    $stmt = $this->query('SELECT * FROM users');
    $rows = $stmt->fetchAll();

    //fetchRow()方法将获取单行,而该fetchAll()方法将返回多行。两种方法都接受原始SQL作为唯一参数。
    $row = $this->fetchRow('SELECT * FROM users');
    $rows = $this->fetchAll('SELECT * FROM messages');

    // 插入数据,只插入一行
    $singleRow = ['nickname'=> 1,'email'=> 'In Progress'];
    $table = $this->table('admin')->insert($singleRow)->saveData();

    // 插入数据,插入多行
    $rows = [
        ['nickname'=> 2,'email'=> 'In Progress'],
        ['nickname'=> 3,'email'=> 'In Progress']
    ];
    $this->table('admin')->insert($rows)->save();

    // 判断表是否存在
    if ($this->hasTable('users')) {
        // 存在
    }

    // 删除user表
    $this->table('user')->drop()->save();
    // 或
    $this->dropTable('user')

    // 给user表从命名
    $table = $this->table('user')->rename('legacy_users');
}

创建表:

public function up()
{
    // 创建user表,所有的操作都在这个基础之上
    $table = $this->table('user');
    $table->setId('uid');// 设置主键,默认为 id
    $table->addTimestamps();// 创建2个timestamp 类型的字段(创建时间和更新时间),不足的是更新时间,修改数据的时候不会自动修改,不知道怎么设置,那位大神会的话麻烦告诉我一下
}

以下内容全部参照于《Thinkphp5入门系列课程》第十二课:Migration(二) 感谢

方法 说明
setId(string $id) 设置主键字段名
setPrimaryKey(string $key) 设置主键
setEngine(string $engine) 设置存储引擎,有:InnoDB,MyISAM
setComment(string $comment) 设置表注释
addTimestamps(string createAtName, stringupdateAtName) 给表加上创建时间更新时间两个字段,默认字段名是:create_time,update_time
addColumn(columnName,type, $options) 给表增加一个字段
changeColumn(columnName,newType, $options) 改变表的某一个字段的属性
create() 创建表
save() 保存表
rename($newTableName) 重命名表名
hasTable($tableName) / exists() 判断表是否存在
drop() 删除当前表
setIndexes(array $indexs) 批量设置索引
setForeignKeys(array $foreignKeys) 设置外键
removeColumn($columnName) 删除字段
renameColumn(oldName,newName) 字段重命名
insert(array $data) 插入数据

给表添加字段 addColumn(columnName,type, $options) 方法

到目前为止,可以支持下面这些类型:

类型 说明
biginteger
binary
boolean
date
datetime
decimal
float
integer
string
text
time
timestamp
uuid

当MysqlVersion >= 5.7的时候,还有下面的类型:

类型 说明
enum
set
blob
json

下面是所有字段类型均支持的可选参数:

参数 说明
limit 长度限制,整数
length 同 limit,整数
default 默认值,mixed
null 是否可空,bool
after 在哪个字段后
comment 注释

下面是针对 decimal 类型:

参数 说明
precision 长度,整数
scale 小数位长度,整数
signed 是否无符号,bool

下面是针对 enum 和 set 类型:

参数 说明
values 默认值

下面是针对 integer 和 biginteger 类型:

参数 说明
identity 自动递增,bool,默认false
signed 无符号,bool

下面是针对 timestamp 类型:

参数 说明
default 默认值,如:CURRENT_TIMESTAMP
update 字段更新时的动作,如:CURRENT_TIMESTAMP
上一篇下一篇

猜你喜欢

热点阅读