如何从主应用程序运行另一个应用程序的迁移

时间:2019-06-27 11:33:01

标签: migration elixir phoenix-framework ecto umbrella

我在我的项目中遵循伞形应用的结构。我正在编写访问层应用程序,该应用程序没有单独的存储库,但需要迁移某些表和关系才能正常工作。我不想为其创建单独的存储库,并使其变得复杂以维护配置等。

我尝试了以下两种方法

defmodule Data.Repo.Migrations.CreateActions do
  use Ecto.Migration

  def change do
    # First approach
    opts = []
    file_path = ExAcl.SeedHelper.priv_path_for("20181129092126_create_actions.exs", app: :acl)
    Ecto.Migrator.run(Data.Repo, file_path, :up, opts)

    {:ok, _} = Application.ensure_all_started(:acl)

    # Second approach
    Ecto.Migrator.up(HaiData.Repo, 20181129092126, ExAcl.Repo.Migrations.CreateActions)
  end
end

但是它不会在另一个应用程序中运行迁移。

也许我没有朝着正确的方向前进。我不确定在另一个应用程序中运行迁移的最佳方法是什么

目标:通过主数据应用在acl应用中运行迁移。

1 个答案:

答案 0 :(得分:1)

如果您尝试通过int从另一个迁移内部运行迁移,则很可能会遇到数据库锁定,因为Ecto不允许您同时运行迁移。

如果要使用此方法,则可以执行以下操作:

Ecto.Migrator.run

但是我不确定从长远来看这将是可维护的。如果还有其他迁移,则必须明确要求并逐个调用每个迁移。那么未来的新迁移又会发生什么呢?因此,我提出以下建议之一:

  1. 如果您只想执行一次迁移并且只执行一次,只需将迁移文件复制到迁移文件夹中

  2. 如果两个迁移文件夹并排发展,并且您希望自动从两个目录运行迁移,则可以两次调用def change do file_path = ExAcl.SeedHelper.priv_path_for("20181129092126_create_actions.exs", app: :acl) Code.require_file(file_path) ModuleInTheMigrationFile.change() end

    ecto.migrate
  3. 如果两个迁移文件夹并排发展,并且您希望从两个目录手动运行迁移,则可以将一个目录中的迁移复制到另一个目录中,并仅保留一个目录作为真实来源