semisedlak / migratte
Migratte 是一款简单的 PHP 数据库迁移工具。
Requires
- php: >=7.4
- ext-json: *
- dibi/dibi: ^4 || ^5
- symfony/console: ^4 || ^5 || ^6
Requires (Dev)
README
Migratte 是一个简单的 SQL 迁移管理独立 CLI 应用,不依赖任何框架。它受到 Phinx 的启发,但更简单,且不需要安装 CakePHP 框架。
您可以使用 composer 安装它
$ composer require semisedlak/migratte
工作原理
它由 (Symfony Console) CLI 命令控制
迁移结构
迁移是简单的 PHP 文件,包含普通的 SQL 查询。如果直接使用 SQL 查询,为什么要用 PHP 文件呢?答案是简单的。为了将 "up"(用于 commit)和 "down"(用于 rollback)SQL 查询以及额外的元数据一起保存。
💡 Migratte 目前不提供丰富的迁移管理功能。它只是一个简单的执行 SQL 查询的工具,您需要自己编写 SQL 查询。您可以使用任何想要的 SQL 查询。
您仍然可以使用 Phinx 和 CakePHP Migrations 进行迁移管理。我推荐 Adminer 用于数据库管理。
特定的迁移类从基本迁移类扩展而来。它包含文件名中的时间戳和不应修改的类名。
不包含 down()
方法的迁移文件是“断点”,这意味着无法执行回滚。但是!有一个选项 --force
可以用于此类迁移的回滚。
此工具在目标迁移相同的数据库中创建其“内存”。它使用 dibi 数据库层 进行连接和查询执行。
您可以使用它与
- MySQL 数据库
- PostgreSQL 数据库
- SQLite 数据库
配置
您可以通过在可执行文件的 Application::boot()
方法的第一个参数中提供选项数组来覆盖这些默认配置选项
'timezone' => 'UTC', 'migrationsDir' => "$workingDir/database/migrations", 'migrationsTable' => [ 'name' => 'migrations', 'primaryKey' => 'id', 'fileName' => 'filename', 'groupNo' => 'group', 'committedAt' => 'committed_at', ], 'connection' => [ 'driver' => 'sqlite', // mysqli or postgre 'database' => "$workingDir/database/migratte.s3db", ],
您可以在 dibi 文档 中阅读如何设置连接。
可执行文件
在您项目的根目录中创建一个名为 bin/migrations
的文件,并包含以下内容
#!/usr/bin/env php <?php use Semisedlak\Migratte\Application\Application; require __DIR__ . '/../vendor/autoload.php'; (Application::boot())->run();
别忘了使用 chmod +x bin/migrations
修改权限
命令
当您在 CLI 中运行 bin/migrations
时,您将看到带有可能命令的“帮助”概述。
root@12345:/var/www/html# bin/migrations
Migratte 0.5.0
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
help Display help for a command
list List commands
migratte
migratte:commit Commit (run) migrations
migratte:generate Generate new migration file
migratte:info Show migrations configuration info
migratte:rollback Rollback migrations
migratte:status Show migrations status
💡 提示:您可以使用
--help
(或-h
)选项查看每个命令的更多详细信息。
migratte:generate
命令生成新的迁移文件,然后可以对其进行修改。您可以将迁移名称作为第一个参数指定。以正常句子写入它,它将自动转换为所需的形式。
$ bin/migrations migratte:generate "Create users table"
这将生成文件 database/migrations/20190101_120000-create-users-table.php
,内容如下
<?php use Semisedlak\Migratte\Migrations\Migration; class Migration_20190101_120000 extends Migration { public static function getName(): string { return 'Create users table'; } public static function up(): string { return <<<SQL -- UP: Create users table SQL; } public static function down(): ?string { return NULL; } }
⚠️ 警告!不要修改迁移类名。提交后不要修改文件名。您可以修改
up()
和down()
方法以包含您的 SQL 查询。
如果您想更改迁移名称,可以在 getName()
方法中更改它。它仅用于显示目的。
然后将您的 SQL 查询复制到 up()
和 down()
方法中。如果 down()
方法返回 NULL 或 FALSE,则被视为“断点”迁移(因为它不提供“down”操作,因此无法回滚)。
示例迁移
public static function up(): string { return <<<SQL CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL ) ENGINE='InnoDB' COLLATE 'utf8mb4_general_ci'; SQL; } public static function down(): ?string { return <<<SQL DROP TABLE `users`; SQL; }
migratte:commit
命令提交(运行)新的迁移。默认情况下,它将依次运行所有未提交的迁移。您可以使用 limit
(第一个)参数指定要提交的较少迁移。
$ bin/migrations migratte:commit 3
但还有更多。您可以使用 --from
和 --to
指定日期限制以限制提交。
不确定将要提交哪些迁移?使用 --dry-run
(或 -d
)选项查看将要提交的迁移而实际上不提交它们。
Migratte 自动将迁移放入组。这些组只是整数编号,它们对于回滚策略很重要。您不能指定组号。它将自动递增。如果您使用默认的回滚策略(按提交日期),则将按提交顺序从最后一个组(编号最高的组)反向回滚迁移。
migratte:rollback
命令执行回滚操作,将已提交的迁移回滚到之前的状态。回滚将仅对(默认情况下)最新组中的迁移进行。
$ bin/migrations migratte:rollback 3
在这种情况下,它将忽略组并回滚最后 3 个已提交的迁移。
如果迁移不包含 down()
方法或此方法仅返回 NULL 或 FALSE,则被视为“断点”。在“断点”上调用回滚将引发错误。这可以通过使用 --force
(或 -f
)选项来绕过。
回滚策略
您可以使用 --strategy
选项指定回滚策略。目前有三种回滚策略
- 按提交 “日期”(这是默认值)(
--strategy=date
)-按提交日期回滚(最后一个组中的迁移将按提交日期以提交的相反顺序回滚) - 按迁移 “顺序”(
--strategy=order
)-按迁移顺序回滚迁移(如果您按名称排序文件,您将得到迁移顺序,因此最后提交的文件将首先回滚) - 按特定 “文件”(
--strategy=file
)-回滚特定迁移文件。您必须提供迁移文件名(不带路径)作为--file
选项。提示:您可以省略.php
扩展名。
migratte:status
命令显示当前迁移的状态(哪些已提交,哪些未提交,哪个迁移是断点等)。
还有一个选项 --compact
(或 -c
)以显示迁移的紧凑表格。
migratte:info
命令显示当前 Migratte 配置。
您是否使用 Nette 框架?
太棒了! 您可以使用 Nette DI 扩展将 Migratte 面板注册到 Tracy(类似于 migratte:status
和 migratte:info
的组合,但... 以 HTML... 的形式... 带样式)。它将使用 dibi
扩展进行连接定义。
extensions: migratte: Semisedlak\Migratte\Nette\DiExtension migratte: debug: true
变更日志
0.4.0
请更新您的 bin/migrations
可执行文件的 Application
类命名空间如下
// use Semisedlak\Migratte\Migrations\Application; // OLD NAMESPACE use Semisedlak\Migratte\Application\Application; // NEW NAMESPACE