Untitled notebook
Mapeando tabelas
Criando schemas
defmodule EctoExample.MovieReviews.Schemas.Movie do
use Ecto.Schema
schema "movies" do
field(:title, :string)
field(:director, :string)
field(:year, :integer)
timestamps()
end
end
defmodule EctoExample.MovieReviews.Schemas.Reviewer do
use Ecto.Schema
schema "reviewers" do
field(:name, :string)
timestamps()
end
end
defmodule EctoExample.MovieReviews.Schemas.Rating do
use Ecto.Schema
schema "ratings" do
field(:stars, :integer)
timestamps()
end
end
Criando tabelas
- Tabelas são criadas no Ecto através de migrations com Ecto SQL
O que são migrations:
- Um histórico de modificações no banco de dados de forma que seja fácil navegar entre alterações e aplicar alterações com facilidade e segurança
- No Ecto, implementamos migrations através do módulo Ecto.Migration
Anatomia de uma migration:
Implementa 2 operações:
-
up
- adiciona mudanças avançando o banco de dados -
down
- reverte mudanças implementadas noup
para serem executadas em caso de erros
defmodule MyRepo.Migrations.AddWeatherTable do
use Ecto.Migration
def up do
create table("weather") do
...
end
end
def down do
drop(table("weather"))
end
end
A maior parte das operações chamadas em up
e down
podem ser subtituídas implementando a função change
:
defmodule MyRepo.Migrations.AddWeatherTable do
use Ecto.Migration
def change do
create table("weather") do
...
end
end
end
O Ecto consegue gerar a operação down
automaticamente para você.
Como é armazenado o estado do banco de dados
O Ecto utiliza a tabela schema_migrations
para armazenar todas as migrations que já foram executadas no ecto
Lidando com concorrência
O Ecto trava alterações na tabela schema_migrations
ao executar uma migration, impedindo que 2 servidores executem a mesma migration ao mesmo tempo.
Gerando nossas primeiras migrations
mix ecto.gen.migration create_movies
defmodule EctoExample.MovieReviews.Repo.Migrations.CreateMovies do
def change do
create table("movies") do
add(:title, :string)
add(:director, :string)
add(:year, :integer)
timestamps()
end
end
end
O Ecto armaneza nossas migrations no diretório priv/migrations/
, no nosso caso em priv/migrations/movie_reviews
mix ecto.gen.migration create_reviewers
defmodule EctoExample.MovieReviews.Repo.Migrations.CreateReviewers do
use Ecto.Migration
def change do
create table("reviewers") do
add(:name, :string)
timestamps()
end
end
end
mix ecto.gen.migration create_ratings
defmodule EctoExample.MovieReviews.Repo.Migrations.CreateRatings do
use Ecto.Migration
def change do
create table("ratings") do
add(:stars, :integer)
timestamps()
end
end
end
Criando banco de dados
mix ecto.create
Executar migrations para criar tabelas
mix ecto.migrate
Referências
- Database migration: Concepts and principles (Part 1) - https://cloud.google.com/architecture/database-migration-concepts-principles-part-1
- Ecto.Migration - https://hexdocs.pm/ecto_sql/Ecto.Migration.html
- Change - https://hexdocs.pm/ecto_sql/Ecto.Migration.html#module-change