graphile/migrate

Allow force running of --once if current.sql has not changed

zacherkkila opened this issue · 2 comments

Feature description

Often we use tricks like select n and increment the number or change current.sql in another way to get it to run.

It would be handy to have a flag to force run --once if the file hasn't changed.

Motivating example

When testing a data migration, it is often very handy to have an idempotent migration that can get run multiple times as you add/change data in your application.

Typical workflow for me in a data migration involves

  • Keep the original data I am moving in place (if possible)
  • Run the migration, check for base functionality, compare against existing
  • Add more data to test the migration and run it again (rinse and repeat as needed)
  • Once tested, add code to cleanup the original data, test again, and ship

Though workarounds are simple as described in the feature description, I think it would be a nice add.

Breaking changes

n/a

Supporting development

I [tick all that apply]:

  • am interested in building this feature myself
  • am interested in collaborating on building this feature
  • [ x ] am willing to help testing this feature before it's released
  • am willing to write a test-driven test suite for this feature (before it exists)
  • [ x ] am a Graphile sponsor ❤️
  • [ x ] have an active support or consultancy contract with Graphile

I think essentially we just want to disable this code:

migrationsAreEquivalent =
currentBodyMinified === previousBodyMinified;
// 4: if different
if (!migrationsAreEquivalent) {
await executeActions(

Which is useful to disable in both watch and watch --once modes.

Maybe --always-different (-a) or --no-ignore-unchanged or --no-require-changes or similar might make sense? --force (-f) also makes sense, but it's a bit less specific and limits our future options, perhaps. A --force-when-unchanged flag that --force automatically enables might make sense... but we'd need some more forces (--force-actions) first.

@jemgillam suggests --force-migration which I think is pretty apt - you're forcing the migration to happen even if no changes occurred.