我在我的项目中遵循伞形应用的结构。我正在编写访问层应用程序,该应用程序没有单独的存储库,但需要迁移某些表和关系才能正常工作。我不想为其创建单独的存储库,并使其变得复杂以维护配置等。
我尝试了以下两种方法
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应用中运行迁移。
答案 0 :(得分:1)
如果您尝试通过int
从另一个迁移内部运行迁移,则很可能会遇到数据库锁定,因为Ecto不允许您同时运行迁移。
如果要使用此方法,则可以执行以下操作:
Ecto.Migrator.run
但是我不确定从长远来看这将是可维护的。如果还有其他迁移,则必须明确要求并逐个调用每个迁移。那么未来的新迁移又会发生什么呢?因此,我提出以下建议之一:
如果您只想执行一次迁移并且只执行一次,只需将迁移文件复制到迁移文件夹中
如果两个迁移文件夹并排发展,并且您希望自动从两个目录运行迁移,则可以两次调用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
如果两个迁移文件夹并排发展,并且您希望从两个目录手动运行迁移,则可以将一个目录中的迁移复制到另一个目录中,并仅保留一个目录作为真实来源