Firstly, we all might have or might not have heard about migration files. It's okay let me share you something. For that we should have some basic knowledge regarding migration.

what are the migration files and their purpose?

Migrations are used to modify your database schema over time and to tell the database about expected structure to have. Phoenix provides many helpers for migrating the database, allowing developers to use Elixir to alter their storage in a way that is database independent.

While working on project I had to create one table in existing database. So I did like as

PC:~/project/myproject$ mix ecto.gen.migration add_weather_table
* creating priv/repo/migrations
* creating priv/repo/migrations/20180331170622_add_weather_table.exs

Here migration file get generated as

defmodule MyProject.Repo.Migrations.AddWeatherTable do
  use Ecto.Migration

  def change do

  end
end

Above we suppose to fill in the empty change/0 function. So I did as

defmodule MyRepo.Migrations.AddWeatherTable do
  use Ecto.Migration

  def change do
    create table("weather") do
      add :city,    :string, size: 40
      add :temp_lo, :integer
      add :temp_hi, :integer
      add :prcp,    :float

      timestamps()
    end
  end
end

After migrating file table get created in database as

PC:~/project/myproject$ mix ecto.migrate

22:55:43.405 [info]  == Running Trackbees.Repo.Migrations.AddWeatherTable.change/0 forward

22:55:43.423 [info]  == Migrated in 0.0s

Then requirement get changed and need to rolled back that migration to delete that table. So I did using file version number (actually timestamp) as

mix ecto.rollback -v 20180331170622

Everything worked fine but later I came to know that there is other better way to do all this. We can use up/0 and down/0 functions, where up/0 is used to update your database and down/0 rolls back the requested changes. We can write migration file as

defmodule MyRepo.Migrations.AddWeatherTable do
  use Ecto.Migration

  def up do
    create table("weather") do
      add :city,    :string, size: 40
      add :temp_lo, :integer
      add :temp_hi, :integer
      add :prcp,    :float

      timestamps()
    end
  end

  def down do
    drop table("weather")
  end
end

Later in project I implemented it for one other file where I wanted to change the column name for table as below

defmodule MyRepo.Migrations.RenameStatusIdToMeetingIdInMentions do
  use Ecto.Migration

  def up do
    rename table(:mentions), :status_id, to: :meeting_id
  end

  def down do
    rename table(:mentions), :meeting_id, to: :status_id
  end
end

Thank you.

Your comment

*

*