THINKPHP5 的数据迁移工具
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 命令介绍:
- migrate:breakpoint 管理断点
- migrate:create 创建一个迁移文件
- migrate:rollback 回滚最后一个或特定的迁移
- migrate:run 迁移数据库
- migrate:status 显示迁移状态
seed 命令介绍:
- seed:create 创建一个数据库填充程序
- seed:run 执行数据库填充
migrate:create 创建数据迁移文件:
php think migrate:create CreateUserTable
CreateUserTable 首字母大写的驼峰法。执行后,会在项目根目录下的database/migrations目录下创建一个迁移文件。
打开生成的迁移文件会看到默认有一个 change
方法,删除自带的 change
方法,创建 up()
方法和 down()
方法。up()
是在执行 run
命令执行的,down()
是在执行 rollback
命令执行的。
请注意,当change
存在方法时,会自动忽略up
和down
方法
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 updateAtName) | 给表加上创建时间和更新时间两个字段,默认字段名是:create_time,update_time |
addColumn(type, $options) | 给表增加一个字段 |
changeColumn(newType, $options) | 改变表的某一个字段的属性 |
create() | 创建表 |
save() | 保存表 |
rename($newTableName) | 重命名表名 |
hasTable($tableName) / exists() | 判断表是否存在 |
drop() | 删除当前表 |
setIndexes(array $indexs) | 批量设置索引 |
setForeignKeys(array $foreignKeys) | 设置外键 |
removeColumn($columnName) | 删除字段 |
renameColumn(newName) | 字段重命名 |
insert(array $data) | 插入数据 |
给表添加字段 addColumn(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 |