agent committed the migration file with a wrong timestamp prefix so it sorts before an older migration
How to fix a migration file committed with a wrong timestamp prefix so it sorts before an older migration: renaming for timestamp-ordered tools, or fixing the chain for graph-ordered tools. Use when the filename order disagrees with the intended apply order. Not for genuinely conflicting migrations.
TL;DR
Whether the filename matters depends on the tool: rails, flyway, and dbmate order by filename, so rename the file to a correct timestamp; alembic and django order by the revision graph, so fix down_revision instead and leave the filename alone. If the mis-ordered file already applied somewhere, do not touch history: fix forward with a new migration.
The query
agent committed the migration file with a wrong timestamp prefix so it sorts before an older migrationUse this when
- Migration file sorts before an older migration due to a bad timestamp
- Wrong timestamp prefix on a committed migration
- File order disagrees with intended apply order
- An agent generated a migration with a stale timestamp
Not for
- Two migrations that genuinely conflict (resolve the conflict, not the name)
- A mis-ordered migration that already applied everywhere (leave history alone)
- Graph-ordered tools where filenames are cosmetic (fix the graph)
Steps
1. Determine whether your tool orders by filename
Rails (db/migrate), flyway (V_ prefixes), dbmate, knex: filename order is apply order. Alembic, django: the revision graph (downrevision / dependencies) is apply order and filenames are cosmetic.
Expected output: the answer decides the fix. Guessing wrong here either does nothing or rewrites history.
2. Case A: filename-ordered tool, file not yet applied - rename it
git mv db/migrate/20240101_[name].rb db/migrate/[correct timestamp]_[name].rbFor flyway, rename V12__ to the correct version number. For rails, also check the class name still matches the filename convention.
Expected output: the file sorts in the intended position and the next migrate applies it in the right order.
3. Case B: graph-ordered tool - fix the chain, ignore the filename
Edit down_revision (alembic) or dependencies (django) to point at the true parent. The filename can stay wrong forever: it is cosmetic.
Expected output: alembic history / migrate --plan shows the intended order regardless of filenames.
4. Case C: it already applied somewhere - fix forward
If any environment applied the file in the wrong position, renaming or re-chaining rewrites history those environments recorded. Instead, write a NEW migration that produces the intended end state, and leave the old file exactly as it applied.
Expected output: history stays consistent everywhere, and the schema converges via the new migration.
5. Prevent it: generate timestamps at commit time
The agent's procedure: migration filenames get their timestamp when created, never copied from a template or an old branch. A CI check can flag files whose timestamp is older than the branch point.
Expected output: stale timestamps stop entering the repo.
Tool compatibility
rails 6.1-8.x, flyway 9/10, dbmate 1/2, alembic 1.x, django 3.2-5.x. The filename-vs-graph distinction is per-tool as described.
Variant phrasings
migration file wrong timestamp sorts before older
Step 1 decides: rename for filename-ordered tools, re-chain for graph-ordered ones.
rails migration timestamp out of order
Step 2: git mv to the correct timestamp; rails orders by the filename prefix.
alembic migration filename wrong order
Step 3: filenames are cosmetic in alembic; fix down_revision instead.
Why it happens
Two different ordering mechanisms exist because the tools model history differently: filename-ordered tools treat the directory listing as the chain, graph-ordered tools treat metadata inside the files as the chain. A wrong timestamp only breaks the first kind, which is why the fix depends on the tool rather than the symptom.
Edge cases
- Renaming a rails file changes its version (the timestamp IS the version): environments that applied the old timestamp now have a "missing" migration. Only rename before anything applies.
- Flyway version numbers must sort correctly as versions, not strings: V9 vs V10 sorts wrong lexicographically in some setups; use consistent zero-padding.
- When both the timestamp and the chain are wrong, fix the chain first (it is the real order), then the filename for readability.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_MuiCpJFElqKVS01lKKavBA