byjg / migration
A simple, framework-agnostic database migration tool that uses pure SQL commands for versioning your database.
Requires
- php: >=8.3 <8.6
- ext-pdo: *
- byjg/anydataset-db: ^6.0
Requires (Dev)
- phpunit/phpunit: ^10.5|^11.5
- vimeo/psalm: ^6.13
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
| sidebar_key | migration | |||
|---|---|---|---|---|
| sidebar_category | data-access | |||
| tags |
|
Database Migration
Version your database with plain SQL files, from any framework or none.
Why
Most migration tools are part of a framework and make you write migrations in its PHP schema builder. The migrations then only run inside that framework, and the SQL your database actually executes is hidden behind it.
Here the schema starts from a base.sql, and each migration is a numbered .sql file in
migrations/up, with an optional script in migrations/down to go back:
base.sql
migrations/up/00001-add-email.sql -- @description: Add the email column
migrations/up/00002-create-orders.sql
- Plain SQL. You write exactly what the database runs, and any tool, PHP or not, can read it.
- Framework independent. Use the
migrateCLI or the library, in any project. - A failed migration is not forgotten. The database is marked partial up or
partial down, and further migrations refuse to run until you fix it (or
--force).
Key Features
- Pure SQL Migrations - Use native SQL commands instead of framework-specific code
- Multiple Database Support - Works with MySQL, PostgreSQL, SQLite, and SQL Server
- Framework Independent - Can be used with any PHP framework or standalone
- CLI & Library Support - Use as a command-line tool or integrate into your PHP application
- Transaction Support - Ensures database consistency (where supported)
- Multi-Developer Friendly - Supports parallel development with -dev suffixed versions
Quick Start
CLI Usage
The package includes a built-in CLI tool:
# Show current database version vendor/bin/migrate version --connection mysql://user:pass@localhost/database # Update database to latest version vendor/bin/migrate update --connection mysql://user:pass@localhost/database --path ./migrations # Reset database and run all migrations vendor/bin/migrate reset -c mysql://user:pass@localhost/database -p ./migrations
See CLI Usage for complete documentation.
Library Usage
<?php $connectionUri = new \ByJG\Util\Uri('mysql://user:pass@localhost/database'); \ByJG\DbMigration\Migration::registerDatabase(\ByJG\DbMigration\Database\MySqlDatabase::class); $migration = new \ByJG\DbMigration\Migration($connectionUri, '.'); $migration->update();
Documentation
For detailed documentation, please visit:
- Getting Started - Basic concepts and setup
- Database Setup - Configure your database connection
- Migration Scripts - Writing and organizing migrations
- CLI Usage - Command line interface guide
- API Reference - Complete API documentation
Supported Databases
- MySQL/MariaDB
- PostgreSQL
- SQLite
- SQL Server (Windows and Linux)
For connection strings and specific database setup, see our database documentation.
Related Projects
Installation
composer require "byjg/migration"
Running Tests
docker compose up -d vendor/bin/phpunit