Как запустить миграцию другого приложения из основного приложения
Я следую за структурой зонтичных приложений в моем проекте. и я пишу приложение уровня доступа, которое не имеет отдельного репо, но требует, чтобы определенные таблицы и отношения были перенесены для его работы. Я не хочу создавать отдельный репозиторий для него и усложнять поддержку конфигов и т. Д.
Я попробовал следующие два подхода
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 ответ
Если вы попытаетесь запустить миграцию через 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
Но я не уверен, насколько это можно отремонтировать в долгосрочной перспективе. Если есть другие миграции, вам придется явно требовать и вызывать каждую миграцию одну за другой. И что будет с новыми миграциями в будущем? Поэтому я предлагаю один из:
Если вы хотите выполнить только одну миграцию и только один раз, просто скопируйте файл миграции в папку миграции
Если две папки миграции развиваются бок о бок, и вы хотите автоматически запускать миграции из обоих каталогов, вы можете вызвать
ecto.migrate
дважды:mix ecto.migrate --migrations-path priv/repo/migrations mix ecto.migrate --migrations-path other/app/priv/repo/migrations
Если две папки миграций развиваются бок о бок, и вы хотите вручную запускать миграции из обоих каталогов, вы можете скопировать миграции из одного каталога в другой и сохранить только один каталог в качестве источника правды.