Packages
ecto_sql
3.0.0
3.14.0
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.1
3.12.0
3.11.3
3.11.2
3.11.1
3.11.0
3.10.2
3.10.1
3.10.0
3.9.2
3.9.1
3.9.0
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
SQL-based adapters for Ecto and database migrations
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/ecto.rollback.ex
defmodule Mix.Tasks.Ecto.Rollback do
use Mix.Task
import Mix.Ecto
import Mix.EctoSQL
@shortdoc "Rolls back the repository migrations"
@moduledoc """
Reverts applied migrations in the given repository.
Migrations are expected at "priv/YOUR_REPO/migrations" directory
of the current application, where "YOUR_REPO" is the last segment
in your repository name. For example, the repository `MyApp.Repo`
will use "priv/repo/migrations". The repository `Whatever.MyRepo`
will use "priv/my_repo/migrations".
You can configure a repository to use another directory by specifying
the `:priv` key under the repository configuration. The "migrations"
part will be automatically appended to it. For instance, to use
"priv/custom_repo/migrations":
config :my_app, MyApp.Repo, priv: "priv/custom_repo"
This task runs all pending migrations by default. Runs the last
applied migration by default. To roll back to a version number,
supply `--to version_number`. To roll back a specific number of
times, use `--step n`. To undo all applied migrations, provide
`--all`.
The repositories to rollback are the ones specified under the
`:ecto_repos` option in the current app configuration. However,
if the `-r` option is given, it replaces the `:ecto_repos` config.
If a repository has not yet been started, one will be started outside
your application supervision tree and shutdown afterwards.
## Examples
mix ecto.rollback
mix ecto.rollback -r Custom.Repo
mix ecto.rollback -n 3
mix ecto.rollback --step 3
mix ecto.rollback -v 20080906120000
mix ecto.rollback --to 20080906120000
## Command line options
* `-r`, `--repo` - the repo to rollback
* `--all` - revert all applied migrations
* `--step` / `-n` - revert n number of applied migrations
* `--to` - revert all migrations down to and including version
* `--quiet` - do not log migration commands
* `--prefix` - the prefix to run migrations on
* `--pool-size` - the pool size if the repository is started only for the task (defaults to 1)
* `--log-sql` - log the raw sql migrations are running
"""
@doc false
def run(args, migrator \\ &Ecto.Migrator.run/3) do
repos = parse_repo(args)
{opts, _, _} = OptionParser.parse args,
switches: [all: :boolean, step: :integer, to: :integer, start: :boolean,
quiet: :boolean, prefix: :string, pool_size: :integer, log_sql: :boolean],
aliases: [n: :step]
opts =
if opts[:to] || opts[:step] || opts[:all],
do: opts,
else: Keyword.put(opts, :step, 1)
opts =
if opts[:quiet],
do: Keyword.merge(opts, [log: false, log_sql: false]),
else: opts
Enum.each repos, fn repo ->
ensure_repo(repo, args)
ensure_migrations_path(repo)
{:ok, pid, apps} = ensure_started(repo, opts)
pool = repo.config[:pool]
migrated =
if function_exported?(pool, :unboxed_run, 2) do
pool.unboxed_run(repo, fn -> migrator.(repo, :down, opts) end)
else
migrator.(repo, :down, opts)
end
pid && repo.stop()
restart_apps_if_migrated(apps, migrated)
end
end
end