How to rollback, reset, or drop Ecto test database?
Asked Answered
B

2

51

Usually mix.test cleans the test database, but it is not working.

It may be because I was playing around with making a users schema, but didn't want to use what I made so I got rid of it. I then started over and made a new schema for users which was different from the first.

When I tried to run mix test again, there was an error that some fields did not exist which should have been there with the new schema.

Bondholder answered 10/2, 2017 at 14:55 Comment(0)
B
95

You can access the test database by using MIX_ENV=test followed by a command such as mix do ecto.drop, mix ecto.reset or mix ecto.rollback.

In this particular case, I used:

MIX_ENV=test mix ecto.reset

If your application has multiple repos (DBs), you'll want to specify a specific repo to avoid applying the operation to all repos. For example

mix ecto.drop --repo Order.Repo

To find out more about an Ecto task, use mix help <task>

Bondholder answered 10/2, 2017 at 14:55 Comment(0)
D
7

You can set aliases into mix.exs like this

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

And you need to run database into sandbox mode.

Your /appdir/test/test_helper.exs should be like this

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

And /appdir/config/test.exs like this

config :project_name, ProjectName.DB.Repo,
  pool: Ecto.Adapters.SQL.Sandbox,
  database: "database_name_test"
Disputation answered 16/2, 2017 at 7:59 Comment(2)
I had this setup but it doesn't really fix the problem at hand. It arises in situations such as 1) create migration 2) run mix test 3) change the migration 4) run mix test again. Since the migration has already run, mix won't see it as a new one and you can get errors such as a non-existent column. That being said, the aliases you described can be used to help fix this, like by using MIX_ENV=test mix ecto.reset.Bondholder
When using the latest Elixir (1.16.0), Phoenix (1.7.7) and phoenix_ecto (4.4) versions, the needed aliases are already implemented (ecto.setup and ecto.reset)Cienfuegos

© 2022 - 2024 — McMap. All rights reserved.