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

How to run migrations of another app from main app

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

我试过两种方法

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 应用中迁移。

如果您尝试通过 Ecto.Migrator.run 从另一个迁移中 运行 迁移,那么您很可能 运行 进入数据库锁,因为 Ecto 不允许您 运行 并发迁移。

如果你想使用这种方法,那么你可以这样做:

def change do
  file_path = ExAcl.SeedHelper.priv_path_for("20181129092126_create_actions.exs", app: :acl)
  Code.require_file(file_path)
  ModuleInTheMigrationFile.change()
end

但我不确定这在长期内的可维护性如何。如果还有其他迁移,那么您将必须显式要求并逐一调用每个迁移。那么未来新的移民会发生什么?因此我建议以下之一:

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

  2. 如果两个迁移文件夹并行发展并且您希望从两个目录自动运行 迁移,您可以调用ecto.migrate 两次:

    mix ecto.migrate --migrations-path priv/repo/migrations
    mix ecto.migrate --migrations-path other/app/priv/repo/migrations
    
  3. 如果两个迁移文件夹并行发展,并且您想从两个目录手动 运行 迁移,您可以将迁移从一个目录复制到另一个目录并只保留一个目录作为真实来源