在什么情况下需要在Ecto迁移中调用flush()?

时间:2018-09-12 17:07:18

标签: elixir ecto phoenix

我试图弄清楚使用冲洗需要哪种情况。

作为反例,这种(琐碎的)情况不需要冲洗:

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.migrateecto.rollback可以“向前”和“向后”工作。第二个宏“更改表”取决于第一个宏“创建表”的完成情况。 flush()不需要在此处指示任何类型的同步依赖项。

我正在尝试定义需要调用flush()以便特定迁移成功运行的情况。

以下是flush的文档: https://hexdocs.pm/ecto/Ecto.Migration.html#flush/0

这是flush的源代码: https://github.com/elixir-ecto/ecto/blob/master/lib/ecto/migration/runner.ex#L96

请注意,刷新的源代码会颠倒“命令”,但并未定义命令的构成。

谢谢!

1 个答案:

答案 0 :(得分:1)

您必须使用冲洗功能,例如刷新(M2)之后的迁移取决于刷新(M1)之前的迁移。需要明确的是,M1M2都是同一迁移文件的一部分,并且都在change/0中定义和执行。

假设M1创建一个表,将列添加到数据库中,并插入一些数据,这些数据是迁移代码的一部分。 M2然后从M1查询表和列,并使用相同的数据生成一个新表。然后,如果没有在flush/0M1之间运行M2,则由于尚未执行迁移,因此无法在M1列上执行查询。