ajiho / think-phinx
Phinx integration for thinkphp6
Requires
- ext-json: *
- fakerphp/faker: ^1.13.0
- psr/container: ^1.0 || ^2.0
- symfony/config: ^3.4|^4.0|^5.0|^6.0
- symfony/console: ^3.4|^4.0|^5.0|^6.0
- topthink/framework: ^6.0.0
This package is auto-updated.
Last update: 2024-04-20 09:17:58 UTC
README
基于phinx封装的一个thinkphp6数据库迁移工具
为什么要封装think-phinx
相对于tp官方的top-think/think-migration不同的是,think-phinx是把phinx
单独通过composer安装,可以自动安装phinx官方的最新版本,bug修复还有特性支持交给phinx官方去做,think-phinx只做了一个桥梁的作用。
think-phinx的优点
- 自动依赖最新的phinx
- 保持和phinx官方一样的指令和使用方式
- 自动数据库连接
- 相对于tp官方的迁移工具,think-phinx支持多数据库(环境,-e选项)迁移
- 像laravel数据库迁移一样、默认模板中保持干净的up、down方法
- 在默认的迁移模板文件中有给出默认的参考示例,方便快速建表
- 集成fakerphp/faker方便假数据填充
- 集成全国省、市、区、街道四级数据光速填充功能
安装
composer require ajiho/think-phinx
composer require ajiho/think-phinx:dev-master
安装完毕后运行php think
会得到如下信息
phinx
phinx:breakpoint Run the phinx [Breakpoint] command
phinx:create Run the phinx [Create] command
phinx:migrate Run the phinx [Migrate] command
phinx:region-table Create a migration for the region database table
phinx:rollback Run the phinx [Rollback] command
phinx:seed:create Run the phinx [Seed Create] command
phinx:seed:run Run the phinx [Seed Run] command
phinx:status Run the phinx [Status] command
执行php think 指令 -h
获取选项的详细说明,比如php think phinx:breakpoint -h
安装注意事项
- 注意问题1
因为tp官方的数据库迁移工具也注册了一个命名空间"Phinx\\": "phinx"
{
"name": "topthink/think-migration",
"authors": [
{
"name": "yunwuxin",
"email": "448901948@qq.com"
}
],
"license": "Apache-2.0",
"autoload": {
"psr-4": {
"Phinx\\": "phinx",
"think\\migration\\": "src"
}
}
....
因此会和单独安装的phinx
容易产生相同命名空间的冲突,所以最佳实践是不要同时安装think-phinx
和top-think/think-migration
- 注意问题2
如果你的tp版本是8.0,且此时你composer所指向的php版本是8.0, 那么你是安装不上phinx的,这个因为它和topthink/framework
的依赖产生了冲突
配置文件
/config/phinx.php
<?php return [ // 路径 'paths' => [ 'migrations' => 'db/migrations', 'seeds' => 'db/seeds' ], // 迁移记录表名 'migration_table' => 'migrations', // 创建文件排序规则 'version_order' => 'creation', // faker本地化 'faker_locale' => 'zh_CN', ];
命令
和phinx官方文档用法一样
创建迁移文件
PS:建议表时最好保持一个命名规范Create表名Table
,必须是大驼峰命名规范
php think phinx:create CreateUserTable
think-phinx提供的特有选项--table
用于指定表名
php think phinx:create CreateUserTable --table user
默认生成的结果如下
<?php
use ajiho\phinx\Migrator;
class CreateUserTable extends Migrator
{
public function up()
{
$table = $this->table('user',['engine'=>'INNODB','collation'=>'utf8mb4_unicode_ci']);
$table->addColumn('username', 'string', ['comment'=>'账号','limit' => 50])
->addColumn('truename', 'string', ['comment'=>'真实姓名','limit' => 50,'null'=>false,'default'=>''])
->addColumn('password', 'string', ['comment'=>'密码','limit' => 255])
->addColumn('email', 'string', ['comment'=>'邮箱','limit' => 50])
->addColumn('phone', 'string', ['comment'=>'手机号码','limit' => 15])
->addColumn('gender', 'enum', ['comment'=>'性别','values' => ['先生', '女士'],'null' => false,'default'=>'先生'])
->addColumn('last_ip', 'char', ['comment'=>'登录IP','limit' => 15])
->addColumn('create_time', 'timestamp', ['comment'=>'创建时间','default' => 'CURRENT_TIMESTAMP'])
->addColumn('update_time', 'timestamp', ['comment'=>'更新时间','default' => 'CURRENT_TIMESTAMP'])
->addColumn('delete_time', 'timestamp', ['comment'=>'删除时间','default' => 'CURRENT_TIMESTAMP'])
->create();
}
public function down()
{
$this->table('user')->drop()->save();
}
}
设置表引擎
$table = $this->table('user',['engine'=>'INNODB','collation'=>'utf8mb4_unicode_ci']);
$table->addColumn('username', 'string', ['comment'=>'账号','limit' => 50])
...
->create();
如果你喜欢手撸原生SQL语句,那么你可以使用execute
方法,
<?php
use ajiho\phinx\Migrator;
class CreateUserTable extends Migrator
{
public function up()
{
$this->execute(
"create table `{$this->_prefix}user`
(
`id` int not null auto_increment primary key,
`username` varchar(50) comment '账号',
`truename` varchar(50) not null default '' comment '真实姓名',
`password` varchar(255) comment '密码',
`email` varchar(50) comment '邮箱',
`phone` varchar(15) comment '手机号码',
`sex` enum('先生','女士') default '先生' comment '性别',
`last_ip` char(15) comment '登录IP',
`create_time` timestamp null comment '创建时间',
`update_time` timestamp null comment '更新时间',
`delete_time` timestamp null comment '删除时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 collate utf8mb4_unicode_ci;"
);
}
public function down()
{
$this->execute(
"drop table if exists {$this->exec_table_prefix}user;"
);
}
}
执行迁移文件
默认迁移指定的默认环境和所有的迁移文件
php think phinx:migrate
指定环境(database.php配置文件里connections下的数组的key值,也就是连接配置标识)
php think phinx:migrate -e mysql
php think phinx:migrate -e mysql2
指定环境同时指定指定的版本或者日期之前的迁移文件
# 表示只执行到20110103081132迁移文件就结束
php think phinx:migrate -e mysql -t 20110103081132
# 表示只执行到2011年1月3号的迁移文件就停止迁移
php think phinx:migrate -e mysql -d 20110103
断点指令
Breakpoint 命令用于设置断点,允许您限制回滚。您可以通过不提供任何参数来切换最近迁移的断点。
php think phinx:breakpoint
php think phinx:breakpoint -e mysql
php think phinx:breakpoint -e mysql -t 20230801141644
php think phinx:breakpoint -e mysql -t 20230801141644 --set
php think phinx:breakpoint -e mysql -t 20230801141644 --unset
# 删除所有断点
php think phinx:breakpoint -e mysql -r
回退迁移
不指定任何参数只回退最后一个迁移文件,步长为1
php think phinx:rollback
指定执行环境,默认环境根据配置文件可以设置
php think phinx:rollback -e mysql
要将所有迁移回滚到特定版本,请使用-t参数
php think phinx:rollback -e mysql -t 20230801141644
回滚所有迁移 -t 0
php think phinx:rollback -e mysql -t 0
要将所有迁移回滚到特定日期,请使用-d参数
php think phinx:rollback -e mysql -d 2012
php think phinx:rollback -e mysql -d 201201
php think phinx:rollback -e mysql -d 20120103
php think phinx:rollback -e mysql -d 2012010312
php think phinx:rollback -e mysql -d 201201031205
php think phinx:rollback -e mysql -d 20120103120530
设置了断点,阻止了进一步的回滚,您可以使用-f 参数覆盖断点。
php think phinx:rollback -e mysql -t 0 -f
将查询打印到标准输出而不执行它们,使用 --dry-run 参数
php think phinx:rollback --dry-run
php think phinx:rollback -t 0 --dry-run
状态指令
Status 命令打印所有迁移的列表及其当前状态。您可以使用此命令来确定已运行哪些迁移。
php think phinx:status
php think phinx:status -e mysql
创建填充文件
PS:建议创建时最好保持一个命名规范填充文件名+Seeder
,必须是大驼峰命名规范
php think phinx:seed:create UserSeeder
运行填充文件
php think phinx:seed:run
php think phinx:seed:run -e mysql
php think phinx:seed:run -s UserSeeder
同时指定多个填充文件,通过 -s 追加
php think phinx:seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder
特定顺序运行填充文件
seeder填充文件默认是随机的,有的时候你需要先填充某个表再填充某个表就需要通过getDependencies()
方法指定特定的顺序进行填充
<?php use ajiho\phinx\Seeder; class UserSeeder extends Seeder { //让填充文件按顺序执行 public function getDependencies() { return [ 'UserSeeder', 'ShopItemSeeder' ]; } ... }
拓展指令说明
phinx:region-table
也支持指定自己的表名
php think phinx:region-table --table youtablename
会生成一个数据库迁移文件。执行该迁移文件会自动填充全国省/市/区/街道四级地区递归数据,数据来源是从高德地图api获取,放心使用。 总共是44949条数据,经过优化处理仅仅只需要大约5秒即可光速填充数据,在开发测试中特别方便。
反馈
需要帮助,给出建议,bug反馈,可以直接联系我