1

我在我的项目中遵循伞形应用程序结构。我正在编写访问层应用程序,它没有单独的存储库,但需要迁移某些表和关系才能使其工作。我不想为它创建单独的 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 应用中运行迁移。

4

1 回答 1

2

如果您尝试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. 如果两个迁移文件夹并排发展,并且您想从两个目录手动运行迁移,则可以将迁移从一个目录复制到另一个目录并仅保留一个目录作为事实来源

于 2019-06-28T11:51:25.873 回答