我试图弄清楚使用冲洗需要哪种情况。
作为反例,这种(琐碎的)情况不需要冲洗:
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()以便特定迁移成功运行的情况。
以下是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
请注意,刷新的源代码会颠倒“命令”,但并未定义命令的构成。
谢谢!
答案 0 :(得分:1)
您必须使用冲洗功能,例如刷新(M2
)之后的迁移取决于刷新(M1
)之前的迁移。需要明确的是,M1
和M2
都是同一迁移文件的一部分,并且都在change/0
中定义和执行。
假设M1
创建一个表,将列添加到数据库中,并插入一些数据,这些数据是迁移代码的一部分。 M2
然后从M1
查询表和列,并使用相同的数据生成一个新表。然后,如果没有在flush/0
和M1
之间运行M2
,则由于尚未执行迁移,因此无法在M1
列上执行查询。