Riferimento rapido

Foglio di riferimento Phoenix Ecto

Guida rapida di riferimento per Ecto in Phoenix ed Elixir: schemi, changeset, validazioni, operazioni Repo e query.

· Pubblicato

Ecto e il wrapper di database e linguaggio di query integrato per applicazioni Elixir.

Schemi (Schemas)

Generazione di codice

$ mix phx.gen.html Accounts Profile profiles email:string age:integer

Definizione dello schema

defmodule MyApp.Accounts.User do
  use Ecto.Schema

  schema "users" do
    field :name, :string
    field :age, :integer
    field :password, :string, virtual: true

    timestamps()
  end
end

Tipi di campo supportati

Field Type Description
:id Integer primary key
:binary_id UUID primary key
:string UTF-8 string
:integer Standard integer
:float Floating-point number
:decimal Arbitrary precision decimal
:boolean True / false value
:map JSON or native map
{:array, inner_type} Array of specified inner type

Changeset e validazioni (Changesets & Validations)

Definire un Changeset

def changeset(user, params \\ :empty) do
  user
  |> cast(params, ~w(name email), ~w(age))
  |> validate_format(:email, ~r/@/)
  |> validate_inclusion(:age, 18..100)
  |> validate_exclusion(:role, ~w(admin superadmin))
  |> validate_subset(:pets, ~w(cat dog parrot whale))
  |> validate_length(:body, min: 1, max: 160)
  |> validate_number(:score, greater_than: 0)
  |> validate_confirmation(:password, message: "does not match")
  |> unique_constraint(:email)
  |> foreign_key_constraint(:post_id)
  |> assoc_constraint(:post)
end

Ispezionare lo stato del Changeset

changeset.valid?         # Boolean validation state
changeset.errors         # List of validation errors
changeset.changes        # Map of modified attributes
changeset.params[:title] # Raw input parameters

Modificare valori del Changeset

changeset
|> put_change(:title, "New Title")
|> force_change(:title, "Forced Title")
|> update_change(:title, &(&1 <> "..."))
|> delete_change(:title)
|> add_error(:title, "cannot be blank")

Operazioni di repository (Repo)

Recupero record

# Fetch by primary key
user = Repo.get(User, id)
user = Repo.get!(User, id)

# Fetch by attributes
user = Repo.get_by(User, email: "[email protected]")

Inserimento, aggiornamento ed eliminazione

# Persist changeset
case Repo.insert(changeset) do
  {:ok, user} -> IO.puts("Created user: #{user.name}")
  {:error, changeset} -> IO.inspect(changeset.errors)
end

Repo.update(changeset)
Repo.insert_or_update(changeset)
Repo.delete(user)

Query Ecto (Ecto Queries)

import Ecto.Query

query = from p in Post,
  where: p.published == true,
  where: [state: "published"],
  order_by: [desc: p.inserted_at],
  limit: 10,
  preload: [:author, :comments],
  select: p

posts = Repo.all(query)

References

Argomenti correlati