如何回滚、重置或删除 Ecto 测试数据库?

50
通常使用mix.test清除测试数据库,但它现在无法正常工作。
这可能是因为我试图创建一个名为users的模式,但并不想使用它,所以我将其删除了。之后我重新开始创建了一个新的用户模式,与第一个模式不同。
当我再次尝试运行mix test时,会出现一些字段不存在的错误,而这些字段应该随着新模式的产生而存在。
2个回答

94

你可以通过使用MIX_ENV=test后跟像mix do ecto.dropmix ecto.resetmix ecto.rollback这样的命令来访问测试数据库。

在这个特定的情况下,我使用了:

MIX_ENV=test mix ecto.reset
如果您的应用程序具有多个存储库(DB),则需要指定特定的存储库以避免将操作应用于所有存储库。例如:
mix ecto.drop --repo Order.Repo

要了解有关 Ecto 任务的更多信息,请使用 mix help <task>


7
您可以像这样在mix.exs中设置别名。
defp aliases do
  [
   "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
   "ecto.reset": ["ecto.drop", "ecto.setup"],
   "test":       ["ecto.create --quiet", "ecto.migrate", "test"]
  ]
end

您需要将数据库运行到沙盒模式。

您的 /appdir/test/test_helper.exs 文件应该像这样

Ecto.Adapters.SQL.Sandbox.mode(ProjectName.DB.Repo, {:shared, self()})
ExUnit.start(exclude: [:pending])

并且像这样/appdir/config/test.exs

config :project_name, ProjectName.DB.Repo,
  pool: Ecto.Adapters.SQL.Sandbox,
  database: "database_name_test"

1
我有这个设置,但它并没有真正解决手头的问题。它会在以下情况下出现:1)创建迁移2)运行mix test3)更改迁移4)再次运行mix test。由于迁移已经运行,因此mix不会将其视为新的迁移,您可能会遇到诸如不存在的列等错误。话虽如此,您所描述的别名可用于帮助解决此问题,例如使用MIX_ENV=test mix ecto.reset - Katherine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接