semisedlak/migratte

Migratte 是一款简单的 PHP 数据库迁移工具。

0.6.0 2024-05-08 18:40 UTC

This package is auto-updated.

Last update: 2024-09-08 19:21:38 UTC


README

Migratte 是一个简单的 SQL 迁移管理独立 CLI 应用,不依赖任何框架。它受到 Phinx 的启发,但更简单,且不需要安装 CakePHP 框架。

您可以使用 composer 安装它

$ composer require semisedlak/migratte

工作原理

它由 (Symfony Console) CLI 命令控制

  1. generate 新迁移
  2. commit 迁移
  3. rollback 迁移
  4. 显示迁移 状态
  5. 显示配置 信息

迁移结构

迁移是简单的 PHP 文件,包含普通的 SQL 查询。如果直接使用 SQL 查询,为什么要用 PHP 文件呢?答案是简单的。为了将 "up"(用于 commit)和 "down"(用于 rollback)SQL 查询以及额外的元数据一起保存。

💡 Migratte 目前不提供丰富的迁移管理功能。它只是一个简单的执行 SQL 查询的工具,您需要自己编写 SQL 查询。您可以使用任何想要的 SQL 查询。

您仍然可以使用 PhinxCakePHP 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 选项指定回滚策略。目前有三种回滚策略

  1. 按提交 “日期”(这是默认值)(--strategy=date)-按提交日期回滚(最后一个组中的迁移将按提交日期以提交的相反顺序回滚)
  2. 按迁移 “顺序”--strategy=order)-按迁移顺序回滚迁移(如果您按名称排序文件,您将得到迁移顺序,因此最后提交的文件将首先回滚)
  3. 按特定 “文件”--strategy=file)-回滚特定迁移文件。您必须提供迁移文件名(不带路径)作为 --file 选项。提示:您可以省略 .php 扩展名。

migratte:status

命令显示当前迁移的状态(哪些已提交,哪些未提交,哪个迁移是断点等)。

还有一个选项 --compact(或 -c)以显示迁移的紧凑表格。

migratte:info

命令显示当前 Migratte 配置。

您是否使用 Nette 框架?

太棒了! 您可以使用 Nette DI 扩展将 Migratte 面板注册到 Tracy(类似于 migratte:statusmigratte: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