Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Untitled notebook

03_mapeando_tabelas.livemd

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 no up 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

entity-relation-model

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