Ecto.Migration
Migrations are used to modify your database schema over time.
This module provides many helpers for migrating the database, allowing developers to use Elixir to alter their storage in a way it is database independent.
Here is an example:
defmodule MyRepo.Migrations.CreatePosts 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
Note migrations have an up/0
and down/0
instructions, where
up/0
is used to update your database and down/0
rolls back
the prompted changes.
Ecto provides some mix tasks to help developers work with migrations:
mix ecto.gen.migration add_weather_table
- generates a migration that the user can fill in with particular commandsmix ecto.migrate
- migrates a repositorymix ecto.rollback
- rolls back a particular migration
Run the mix help COMMAND
for more information.
Change
Migrations can also be automatically reversible by implementing
change/0
instead of up/0
and down/0
. For example, the
migration above can be written as:
defmodule MyRepo.Migrations.CreatePosts 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
Notice not all commands are reversible though. Trying to rollback
a non-reversible command will raise an Ecto.MigrationError
.
Summary↑
add(column, type \\ :string, opts \\ []) | Adds a column when creating or altering a table |
alter(object, list2) | Alters a table |
create(object) | Creates an index |
create(object, list2) | Creates a table |
drop(object) | Drops a table or index |
execute(command) | Executes arbitrary SQL |
exists?(object) | Checks if a table or index exists |
index(table, columns, opts \\ []) | Returns an index struct that can be used on |
modify(column, type, opts \\ []) | Modifies a column when altering a table |
references(table, opts \\ []) | Adds a foreign key |
remove(column) | Removes a column when altering a table |
table(name, opts \\ []) | Returns a table struct that can be given on create, alter, etc |
timestamps() | Adds |
Functions
Adds a column when creating or altering a table.
Examples
create table(:posts) do
add :title, :string, default: "Untitled"
end
alter table(:posts) do
add :summary, :text
end
Options
:default
- the column's default value.:primary_key
- when true, marks this field as the primary key:null
- whenfalse
, the column does not allow null values.:size
- the size of the type (for example the numbers of characters). Default is no size.:precision
- the precision for a numberic type. Default is no precision.:scale
- the scale of a numberic type. Default is 0 scale.
Creates an index.
Examples
create index(:posts, [:name])
Drops a table or index.
Examples
drop index(:posts, [:name])
drop table(:posts)
Executes arbitrary SQL.
Examples
execute "UPDATE posts SET published_at = NULL"
Checks if a table or index exists.
Examples
exists? table(:products)
Returns an index struct that can be used on create
, drop
, etc.
Expects the table name as first argument and the index fields as second. The field can be an atom, representing a column, or a string representing an expression that is sent as is to the database.
Indexes are non-unique by default.
Examples
# Without a name, index defaults to products_category_id_sku_index
create index(:products, [:category_id, :sku], unique: true)
# Name can be given explicitly though
drop index(:products, [:category_id, :sku], name: :my_special_name)
Modifies a column when altering a table.
Examples
alter table(:posts) do
modify :title, :text
end
Options
Accepts the same options as add/3
.
Adds a foreign key.
Examples
create table(:product) do
add :category_id, references(:category)
end
Options
:column
- The foreign key column, default is:id
:type
- The foreign key type, default is:integer
Removes a column when altering a table.
Examples
alter table(:posts) do
remove :title
end
Returns a table struct that can be given on create, alter, etc.
Examples
create table(:products) do
add :name, :string
add :price, :decimal
end
drop table(:products)
create table(:products, primary_key: false) do
add :name, :string
add :price, :decimal
end
Options
:primary_key
- when false, does not generate primary key on table creation
Adds :inserted_at
and :updated_at
timestamps columns.
Those columns are of :datetime
type and cannot be null.
Macros
Alters a table.
Examples
alter table(:posts) do
add :summary, :text
modify :title, :text
remove :views
end
Creates a table.
By default, the table will also include a primary_key of name :id
and type :serial
. Check table/2
docs for more information.
Examples
create table(:posts) do
add :title, :string, default: "Untitled"
add :body, :text
timestamps
end