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