【问题标题】:How to rollback a specific ecto migration?如何回滚特定的外迁移?
【发布时间】:2018-12-18 11:03:56
【问题描述】:

Phoenix 与 Rails 的等价物是什么?

rake db:migrate:down VERSION=20100905201547

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    目前有no way to accomplish this

    我们可以使用以下方法一直回滚到特定迁移:

    mix ecto.rollback -v 20080906120000
    

    mix ecto.rollback --to 20080906120000
    

    但是对于这两种语法,当前语法和指定语法之间的所有迁移也将被回滚。

    Elixir Forum 的一位用户还提到,创建一个新的迁移来撤消需要撤消的操作将是保持历史可访问性的好方法。

    【讨论】:

    • -v 标志不再有效。要回滚特定迁移,只需运行 mix ecto.rollback 20080906120000
    • 你也可以退一步,我发现这比找到时间戳要容易得多mix ecto.rollback --step 2
    【解决方案2】:

    这应该可以解决问题:

    def rollback(version) when is_integer(version) do
      re = ~r/^#{version}_.*\.exs/
      path = Application.app_dir(:your_app, Path.join(["priv", "repo", "migrations"]))
    
      with {:find, "" <> file} <- {:find, Enum.find(File.ls!(path), &String.match?(&1, re))},
            {:compile, [{mod, _} | _]} <- {:compile, Code.compile_file(Path.join(path, file))},
            {:rollback, :ok} <- {:rollback, Ecto.Migrator.down(Repo, version, mod)} do
        {:ok, "Reversed migration: #{file}"}
      else
        {:find, _} -> {:error, "No migration found with version prefix: #{version}"}
        {:compile, e} -> {:error, "Problem compiling migration module: #{inspect(e)}"}
        {:rollback, e} -> {:error, "Problem reversing migration: #{inspect(e)}"}
        e -> {:error, "Something unexpected happened: #{inspect(e)}"}
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2014-06-21
      • 2017-02-24
      • 2017-03-18
      • 2017-10-21
      • 2016-08-19
      • 2017-10-25
      • 2013-07-15
      • 2018-01-05
      相关资源
      最近更新 更多