Catch unsafe migrations in your Elixir application
strong_migrations
is a library that protects your application from invoking unsafe migrations, they needs to be marked as a safe.
- Analyze migrations if they are safe.
- If migrations are unsafe -> print errors.
- If migrations are safe -> use
ecto.migrate
.
You can also use a macro of StrongMigrations
like safety_assured
to be sure it's safe and you can run migrations with specific changes. Example
defmodule SafetyAssuredDropTable do
@moduledoc false
use StrongMigrations
def change do
safety_assured do
drop(table(:users))
end
end
end
- checking if your migrations are adding an index concurrently in transaction
- checking if your migrations are adding an index but not concurrently
- checking if your migrations are removing an index concurrently in transaction
- checking if your migrations are renaming columns (it's always better to remove old and add new column)
- checking if your migrations are removing columns
- checking if your migrations are removing tables
- mark
safety assured do: drop table(:posts)
or multiline when you're sure it's safe - check if default is a function when altering a table ... tbd
The package can be installed by adding strong_migrations
to your list of dependencies in mix.exs
as follows. Also, it's worth adding an alias like: ecto.migrate -> strong_migrations.migrate
and thanks to that you'll be sure that all migrations were checked before running.
Update your mix.exs
:
def deps do
[
{:strong_migrations, "~> 0.1"}
]
end
Optionally, you can add an alias:
"ecto.migrate": "strong_migrations.migrate"
And, another option is to use StrongMigrations
as a default for generated migrations. Just add following line to your config.exs
file.
config :ecto_sql, migration_module: StrongMigrations
If you want to specify which classifiers you want to use, please add to your config.exs
following lines
config :strong_migrations,
classifiers: [
StrongMigrations.Classifiers.AddIndexConcurrentlyInTransaction,
StrongMigrations.Classifiers.AddIndexNotConcurrently,
StrongMigrations.Classifiers.DropIndexConcurrentlyInTransaction,
StrongMigrations.Classifiers.DropTable,
StrongMigrations.Classifiers.RemoveColumn,
StrongMigrations.Classifiers.RenameColumn,
StrongMigrations.Classifiers.DefaultIsFunction
]
If you want to specify migration paths available in your project (not default -> priv/repo/migrations
), please add to your config.exs
following lines
config :strong_migrations,
migration_paths: [
"priv/repo/migrations",
"apps/*/priv/repo/migrations",
"my/fancy/path/to/migrations"
],