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:
Exemplo de migration:
defmodule Rocketpay.Repo.Migrations.CreateUserTable douse Ecto.Migrationdef change do# Criação da tabela e colunascreate table :users doadd :name, :stringadd :age, :integeradd :email, :stringadd :password_hash, :stringadd :nickname, :stringtimestamps() # Cria as colunas created_at e updated_atend# Criação de índices pertinentes a determinadas colunascreate unique_index(:users, [:email])create unique_index(:users, [:nickname])endend
Para rodar a migration, basta rodar o comando:
mix ecto.migrate
Output:
Para dar rollback no banco (drop), basta rodar o comando:
mix ecto.drop
Output:
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.exsconfig :rocketpay, Rocketpay.Repo,migration_primary_key: [type: :binary_id],migration_foreign_key: [type: :binary_id]
Schema
# lib/rocketpay/users.exdefmodule Rocketpay.User douse Ecto.Schemaimport Ecto.Changeset@primary_key {:id, :binary_id, autogenerate: true}@required_params [:name, :age, :email, :password, :nickname]schema "users" dofield :name, :stringfield :age, :integerfield :email, :stringfield :password, :string, virtual: truefield :password_hash, :stringfield :nickname, :stringenddef 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()enddefp put_password_hash(_banana) doendend