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
Requires
- php: ^8.3
- ext-pdo: *
- kuaukutsu/ds-collection: ^2.1
- league/climate: ^3.10
- symfony/console: ^7.4
Requires (Dev)
- php-di/php-di: ^7.0
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^10.5
- rector/rector: ^2.0
- roave/security-advisories: dev-latest
- slevomat/coding-standard: ^8.7
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^6.13
This package is auto-updated.
Last update: 2025-12-24 15:09:56 UTC
README
Консольная программа для управления миграциями.
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