Skip to content

Catch unsafe migrations in your Elixir application

License

Notifications You must be signed in to change notification settings

fresha/strong_migrations

Repository files navigation

StrongMigrations

Build Status Module Version Hex Docs Total Download License Last Updated

Catch unsafe migrations in your Elixir application

Table of Contents

What is it

strong_migrations is a library that protects your application from invoking unsafe migrations, they needs to be marked as a safe.

  1. Analyze migrations if they are safe.
  2. If migrations are unsafe -> print errors.
  3. 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

Features

  • 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

How to install

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

How to configure

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"
  ],

Similar Packages