Ecto

O que é

Ecto é um projeto oficial do Elixir que fornece uma camada de banco de dados e linguagem integrada para consultas. Com Ecto podemos criar migrações, definir esquemas, inserir e atualizar registros, e fazer consultas.

Configurando o banco de dados

Com as variáveis do banco definidas nos arquivos dentro de /config/*.exs, roda-se o comando abaixo para configurar o banco de dados

mix ecto.crete

Caso haja algum erro, certifique-se que o banco de dados está configurado corretamente e rodando.

Migrations

Criando uma migration

Para criar uma migration, basta rodar o comando abaixo.

No Elixir não é necessário criar um método up e um método down, embora isso seja possível.
mix ecto.gen.migration NOME_DA_MIGRATION

Output:

02 ecto migration created

Exemplo de migration:

defmodule Rocketpay.Repo.Migrations.CreateUserTable do
use Ecto.Migration
def change do
# Criação da tabela e colunas
create table :users do
add :name, :string
add :age, :integer
add :email, :string
add :password_hash, :string
add :nickname, :string
timestamps() # Cria as colunas created_at e updated_at
end
# Criação de índices pertinentes a determinadas colunas
create unique_index(:users, [:email])
create unique_index(:users, [:nickname])
end
end

Para rodar a migration, basta rodar o comando:

mix ecto.migrate

Output:

02 ecto migration running

Para dar rollback no banco (drop), basta rodar o comando:

mix ecto.drop

Output:

02 ecto migration drop

Configuração de FK e ID

Para configurar a foreign key e ID único como UUID, deve-se incluir as seguintes linhas no arquivo config.exs:

# config/config.exs
config :rocketpay, Rocketpay.Repo,
migration_primary_key: [type: :binary_id],
migration_foreign_key: [type: :binary_id]

Schema

# lib/rocketpay/users.ex
defmodule Rocketpay.User do
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
@required_params [:name, :age, :email, :password, :nickname]
schema "users" do
field :name, :string
field :age, :integer
field :email, :string
field :password, :string, virtual: true
field :password_hash, :string
field :nickname, :string
end
def changeset(params) do
%__MODULE__{}
|>cast(params, @required_params)
|>validate_required(@required_params)
|>validate_length(:password, min: 6)
|>validate_number(:age, greater_than_or_equal_to: 18)
|>validate_format(:email, ~r/@/)
|>unique_constraint([:email])
|>unique_constraint([:nickname])
|>put_password_hash()
end
defp put_password_hash(_banana) do
end
end