При каких условиях flush () должен вызываться в Ecto-миграции? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь выяснить, какая ситуация потребует использования флеша.

В качестве контрпримера, эта (тривиальная) ситуация не требует сброса:

defmodule MyRepo.Migrations.TestFlush do
  use Ecto.Migration

  def change do
    create table(:test)
    alter table(:test) do
      add :a, :integer
    end
  end
end

Работает как «вперед», так и «назад», используя ecto.migrate и ecto.rollback соответственно. Второй макрос «изменить таблицу» зависит от завершения первого макроса «создать таблицу». flush () не требуется для указания какой-либо синхронной зависимости здесь.

Я пытаюсь определить ситуации, когда flush () должен вызываться для успешного выполнения конкретной миграции.

Вот документы для флеша: https://hexdocs.pm/ecto/Ecto.Migration.html#flush/0

Вот исходный код для сброса: https://github.com/elixir-ecto/ecto/blob/master/lib/ecto/migration/runner.ex#L96

Обратите внимание, что исходный код для flush переворачивает «команды», но он не определяет, что составляет команду.

спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Вы должны использовать сброс, например, когда ваша миграция после сброса (M2) зависит от миграций до сброса (M1).Для ясности, M1 и M2 являются частью одного и того же файла миграции, и оба определены и выполнены в change/0.

Допустим, M1 создает таблицу, добавляет столбцы в базу данныхи вставляет некоторые данные, которые являются частью вашего кода миграции.M2 затем запрашивает таблицу и столбцы из M1 и генерирует новую таблицу с теми же данными.Затем, если вы не запустите flush/0 между M1 и M2, вы не сможете выполнить запрос к столбцу M1, поскольку миграция еще не выполнена.

...