safe-pg-migrations
safe-pg-migrations copied to clipboard
Escape hatch for unsafe migrations
Hi!
Some migrations unfortunately cannot be run safely and are then impossible to run.
When using a partitioned table on PostgreSQL, this migration, where slots
is the partitioned table, will fail because of 2 Postgres errors:
add_reference :slots, :variation, index: true, foreign_key: true
-
ActiveRecord::StatementInvalid: PG::WrongObjectType: ERROR: cannot add NOT VALID foreign key on partitioned table "slots" referencing relation "variations"
: sincevalidate: false
is forced -
PG::FeatureNotSupported: ERROR: cannot create index on partitioned table "stock_slots" concurrently
: sincealgorithm: :concurrently
is forced
Is there a way to explicitly disable the safeness in a block? If not, what about a block:
unsafe_migration do
add_reference :slots, :variation, index: true, foreign_key: true, validate: true
end
Telling: I know it is not safe, and then it can be caught before deployment to take appropriate measures.
For the record, I found my way around using 3 distinct commands:
add_column :slots, :variation_id, :integer
add_foreign_key :slots, :variations, validate: true
add_index :slots, :variation_id, algorithm: :default
Hey @guewen, thanks for taking the time to open this issue.
It's indeed not possible today.
I'd rather give a more explicit name to this method (ex: safe_pg_migrations_disable
) like we already do for safe_pg_migrations_verbose.
Do you feel like giving a try at implementing it?