dragon-code/migrate-db
Laravel package for migrating data between different database systems. Move tables and records from MySQL, PostgreSQL, SQLite, SQL Server and more using configurable mappings, artisan commands and safe, resumable transfers.
What it is: A Laravel package that moves data from one database connection to another — typically MySQL → PostgreSQL or between environments — by iterating Eloquent models and re-inserting rows through a second connection. It is an artisan-command-driven tool, not a library API, which shapes both its fit and its limits.
Architecture fit: Good fit for Laravel shops that already have Eloquent models with declared connections and relationships. The model-driven approach means it respects casts, attribute mutators, and relationship ordering for free — a real advantage over raw mysqldump/pg_restore pipelines when the source and target engines differ. It is a poor fit for schema migration (it moves rows, not DDL) and for non-Laravel services in a polyglot estate.
Integration feasibility: Low friction to trial. Composer install, publish config, declare source/target connections in config/database.php, run a dry pass in staging. No service dependencies, no daemon, no external storage. A single engineer can produce a proof of concept in a day.
Technical risk: The dominant risk is lifecycle, not technology. The repository is archived and has zero dependents — that combination means effectively no downstream validation surface and no upstream response to Laravel major-version breaks. It is a single-maintainer project (Dragon Code ecosystem) with modest adoption at 155 stars. A 2026-03-18 release followed by archival suggests the maintainer shipped a final compatible version and stepped away; that is a stable artifact but a dead one. Additional functional risks: column types that do not round-trip cleanly between engines (JSON, binary, ENUM, timezone-bearing timestamps), foreign-key ordering, and auto-increment/UUID key collisions on repeated runs.
Key questions to answer before committing:
Stack fit: Narrow and specific — Laravel, Eloquent, Composer. It slots into an existing Laravel monolith or a set of Laravel services sharing a connection config. If our target system is not Laravel, or if we are doing a same-engine move, the value proposition largely evaporates and native tooling wins.
Migration path: Treat it as a one-time or occasionally-invoked operational tool, not a runtime dependency. Recommended shape: pin the exact version in composer.json, use it from a dedicated console command or a tagged release branch rather than the default application dependency set, and keep it out of the production web image. If we adopt it, we should assume ownership of the source — fork it, vendor it, or at minimum mirror the pinned version internally so a Packagist or GitHub removal cannot break a future run.
Compatibility: The hard constraint is the Laravel major version. Pin both laravel/framework and this package, and validate the pair in CI. Cross-engine transfers (MySQL → PostgreSQL) need an explicit audit of column type mapping; same-engine transfers are lower risk. Verify that the final release's constraints allow our PHP version, since an archived package will not gain a new constraint for PHP 8.4+.
Sequencing:
ENUM, and generated columns.If step 2 or 3 fails on our schema, fall back to native dump/restore or a purpose-built ETL before investing further — the sunk cost at that point is one engineer-week.
Maintenance: Zero upstream maintenance available. The archived status means no security patches, no Laravel 12/13 compatibility, no bug fixes. Every hour we rely on it becomes our hour. Budget for a fork owner and a periodic compatibility review at each Laravel upgrade, or explicitly scope the tool to a single decommissioning project and retire it afterward.
Support: Community-only and thin — 155 stars, no dependents, archived issues. There is no vendor, no SLA, and no realistic expectation of an answer to a filed issue. Internal documentation and a named subject-matter expert are mandatory if this survives past one project.
Scaling: Data volume is the likely breaking point. Model-hydrated transfers degrade on large tables; expect memory ceilings and long-running transactions. Confirm chunk size behavior and test against our largest table (not the average one) at production scale. The tool also competes for connection pool capacity during cutover, so it should run from a dedicated worker, not a web node.
Failure modes to plan for:
ENUM defaulting) that reconciles on row count but not on content.Each of these needs a documented detection and recovery step, and the verification gate — counts plus content checksums, not counts alone — is the non-negotiable control.
Ramp-up: Low. A Laravel-fluent engineer is productive in under a day; the commands are conventional artisan surface. The real cost is not learning the tool but building the verification and rollback harness around it — roughly one to two engineer-weeks for a cutover of meaningful size.
Verdict: Technically adequate, operationally orphaned. Justifiable as a scoped, one-way data migration utility with a pinned version, internal mirror, and a verification harness — with a native-tooling fallback pre-agreed. Not justifiable as a standing dependency in a system we intend to run for years.
How can I help you explore Laravel packages today?