美文网首页
THINKPHP5 的数据迁移工具

THINKPHP5 的数据迁移工具

作者: a564c12b3104 | 来源:发表于2018-11-07 10:19 被阅读8次

    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 类型的字段(创建时间和更新时间),不足的是更新时间,修改数据的时候不会自动修改,不知道怎么设置,那位大神会的话麻烦告诉我一下
    }
    
    
    
    方法 说明
    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) 方法

    • $columnName 字段名
    • $type 字段类型

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

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

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

    类型 说明
    enum
    set
    blob
    json
    • $options 可选参数

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

    参数 说明
    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

    相关文章

      网友评论

          本文标题:THINKPHP5 的数据迁移工具

          本文链接:https://www.haomeiwen.com/subject/skpmxqtx.html