【问题标题】:How to run migrations of another app from main app如何从主应用程序运行另一个应用程序的迁移
【发布时间】:2019-06-27 11:33:01
【问题描述】:

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

【问题讨论】:

    标签: migration elixir phoenix-framework ecto umbrella


    【解决方案1】:

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

    【讨论】:

    • 我可以为它创建别名吗?在根应用和/或数据应用中?
    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多