Как запустить миграцию другого приложения из основного приложения - PullRequest
1 голос
/ 27 июня 2019

Я следую структуре зонтичных приложений в своем проекте.и я пишу приложение уровня доступа, которое не имеет отдельного репо, но требует, чтобы определенные таблицы и отношения были перенесены для его работы.Я не хочу создавать отдельный репозиторий для него и делать его сложным для поддержки конфигов и т. Д.

Я пробовал следующие два подхода

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 Ответ

1 голос
/ 28 июня 2019

Если вы попытаетесь запустить миграцию через 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. Если дваПапки миграции развиваются бок о бок, и вы хотели бы вручную запускать миграции из обоих каталогов, вы можете скопировать миграции из одного каталога в другой и сохранить только один каталог как источник правды

...