kuaukutsu/poc-migration

Proof of Concept: Database migration

Installs: 3

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/kuaukutsu/poc-migration

0.2.2 2025-12-24 15:08 UTC

This package is auto-updated.

Last update: 2025-12-24 15:09:56 UTC


README

PHP Version Require Latest Stable Version License Psalm Level Psalm Type Coverage

Консольная программа для управления миграциями.

setup

Например, для базы данных с именем main под управлением сервера postgres:

mkdir -p ./migration/pgsql/{main,main-fixture} 

Описываем конфигурацию:

$migrator = new Migrator(
    dbCollection: new DbCollection(
        new Db(
            path: __DIR__ . '/migration/postgres/main',
            driver: new PdoDriver(
                dsn: 'pgsql:host=postgres;port=5432;dbname=main',
                username: 'postgres',
                password: 'postgres',
            )
        )
    ),
);

migration

Команды миграции описываются на языке SQL, например:

-- @up
CREATE TABLE IF NOT EXISTS public.entity (
    id serial NOT NULL,
    parent_id integer NOT NULL,
    created_at timestamp(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    updated_at timestamp(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT entity_pkey PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS "I_entity_parent_id" ON public.entity USING btree (parent_id);

-- @down
DROP INDEX IF EXISTS I_entity_parent_id;
DROP TABLE IF EXISTS public.entity;

Управляющие команды:

  • @up
  • @down
  • @skip

Если команды не указаны, то весь код будет вычитан как секция up.
Если нужно скипнуть файл целиком, то можно добавить в название постфикс skip, например 202501011025_name_skip.sql

CLI application

use DI\Container;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use kuaukutsu\poc\migration\connection\PdoDriver;
use kuaukutsu\poc\migration\presentation\DownCommand;
use kuaukutsu\poc\migration\presentation\FixtureCommand;
use kuaukutsu\poc\migration\presentation\InitCommand;
use kuaukutsu\poc\migration\presentation\UpCommand;
use kuaukutsu\poc\migration\tools\PrettyConsoleOutput;
use kuaukutsu\poc\migration\Db;
use kuaukutsu\poc\migration\DbCollection;
use kuaukutsu\poc\migration\Migrator;

use function DI\factory;

require dirname(__DIR__) . '/vendor/autoload.php';

$container = new Container(
    [
        Migrator::class => factory(
            fn(): Migrator => new Migrator(
                dbCollection: new DbCollection(
                    new Db(
                        path: __DIR__ . '/migration/sqlite/memory',
                        driver: new PdoDriver(
                            dsn: 'sqlite:' . __DIR__ . '/data/sqlite/db.sqlite3',
                        )
                    )
                ),
                eventSubscribers: [
                    new PrettyConsoleOutput(),
                ],
            )
        ),
    ]
);

$console = new Application();
$console->setCommandLoader(
    new ContainerCommandLoader(
        $container,
        [
            'migrate:init' => InitCommand::class,
            'migrate:up' => UpCommand::class,
            'migrate:down' => DownCommand::class,
            'migrate:fixture' => FixtureCommand::class,
        ],
    )
);

try {
    exit($console->run());
} catch (Exception $e) {
    exit(Command::FAILURE);
}

Static analysis

To run static analysis:

make psalm
make phpstan

Unit testing

The package is tested with PHPUnit. To run tests:

make phpunit