Základy

Niektoré časti tohto prekladu môžu byť neaktuálne.
Viacero drobných zmien bolo pridaných do originálnej lekcie od poslednej aktualizácie.

Ecto je oficiálny Elixir projekt, ktorý poskytuje zaobalenie databázy a integrovaný jazyk na vytváranie dotazov. S Ectom sme schopní vytvárať migrácie, definovať schémy, vkladať/upravovať záznamy a dotazovať ich.

Obsah

Adaptéry

Ecto podporuje rôzne databázy použitím adaptérov. Pár príkladov adaptérov sú:

  • PostgreSQL
  • MySQL
  • SQLite

Pre túto lekciu nakonfigurujeme Ecto, aby používal adaptér PostgreSQL.

Začíname

V priebehu tejto lekcie pokryjeme tri hlavné časti Ecta:

  • Repozitár — poskytuje rozhranie našej databázy, vrátane pripojenia
  • Migrácie — mechanizmus na vytváranie, modifikovanie, mazanie tabuliek a indexov v databáze
  • Schémy — špeciálne štruktúry, ktoré reprezentujú záznamy v tabuľke

Na začiatok si vytvoríme aplikáciu so supervision stromom supervízorov (supervision tree).

$ mix new friends --sup
$ cd friends

Do súboru mix.exs pridáme ako závislosti balíčky ecto a postgrex.

  defp deps do
    [
      {:ecto, "~> 2.0"},
      {:postgrex, "~> 0.11"}
    ]
  end

Stiahneme závislosti použitím príkazu

$ mix deps.get

Vytvorenie Repozitára

Repozitár v Ecte sa pripojí na dátové úložisko ako napríklad našu Postgres databázu. Všetka komunikácia s databázou bude vykonávaná pomocou tohto repozitára.

Nastavíme repozitár spustením:

$ mix ecto.gen.repo -r Friends.Repo

Príkaz vygeneruje potrebnú konfiguráciu v config/config.exs na pripojenie k databáze vrátane adaptéru, ktorý má použiť. Toto je konfiguračný súbor pre našu aplikáciu Friends

config :friends, Friends.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "friends_repo",
  username: "postgres",
  password: "",
  hostname: "localhost"

Tu je nastavené ako sa Ecto pripojí na databázu. Všimnite si, že bol ako adaptér zvolený Ecto.Adapters.Postgres.

Tiež bol vytvorený modul Friends.Repo v súbore lib/friends/repo.ex

defmodule Friends.Repo do
  use Ecto.Repo, otp_app: :friends
end

Modul Friends.Repo budeme používať na dotazovanie databázy. Ako parameter dodáme kľúč, pod ktorým sa dá nájsť konfigurácia našej OTP aplikácie.

Ďalej nastavíme Friends.Repo ako supervízora v supervision strome našej aplikácie v lib/friends/application.ex. To nám zabezpečí spustenie procesu Ecta, keď sa spustí naša aplikácia.

  def start(_type, _args) do
    # List all child processes to be supervised
    children = [
      Friends.Repo,
    ]

  ...

Potom budeme musieť do nášho súboru config/config.exs pridať nasledujúci riadok:

config :friends, ecto_repos: [Friends.Repo]

Toto umožní našej aplikácii spustiť ecto mix príkazy z príkazového riadku.

Práve sme úspešne nakonfigurovali repozitár! Môžeme vytvoriť Postgres databázu pomocou nasledujúceho príkazu:

$ mix ecto.create

Ecto použije informácie v súbore config/config.exs na vytvorenie pripojenia do Postgresu a voľbu mena databázy.

Ak sa zobrazia nejaké chyby, overte, že nakonfigurované informácie sú správne a že inštancia Postgresu beží.

Migrácie

Na vytváranie a modifikovanie tabuliek v postgres databáze nám Ecto poskytuje migrácie. Každá migrácia opisuje súbor akcií, ktoré majú byť vykonané na našej databáze, napr. ktoré tabuľky má vytvoriť alebo upraviť.

Keďže naša databáza nemá zatiaľ žiadne tabuľky, vytvoríme migráciu, ktorou nejaké pridáme. V Ecte je konvenciou voliť názvy tabuliek v množnom čísle - pre našu aplikáciu budeme potrebovať tabuľku people.

Najlepší spôsob ako vytvoriť migrácie je mix príkaz ecto.gen.migration <name>, čiže v našom prípade:

$ mix ecto.gen.migration create_people

Toto nám vygeneruje nový súbor v zložke priv/repo/migrations, ktorý obsahovať v názve súboru timestamp (časovú značku). Po otvorení vygenerovaního súboru (v adresári priv/repo/migrations) by sme mali vidieť niečo takéto:

defmodule Friends.Repo.Migrations.CreatePeople do
  use Ecto.Migration

  def change do

  end
end

Začnime úpravou funkcie change/0, aby sme vytvorili novú tabuľku people so stĺpcami name a age:

defmodule Friends.Repo.Migrations.CreatePeople do
  use Ecto.Migration

  def change do
    create table(:people) do
      add :name, :string, null: false
      add :age, :integer, default: 0
    end
  end
end

Ako vidíme vyššie, stĺpcom sme definovali dátový typ, obmedzenie na nenulovú hodnotu (null: false) a predvolenú hodnotu (default: 0).

Teraz ale poďme do príkazového riadku a spusťme našu migráciu:

$ mix ecto.migrate

Schémy

Potom ako sme vytvorili našú prvú tabuľku musíme Ectu o nej niečo povedať, čiastočne sa to robí pomocou použitia schém. Schéma je modul, ktorý definuje mapovanie atribútov na stĺpce danej tabuľky v databáze.

Ecto síce uprednostňuje mená tabuliek v množnom čísle, ale meno schémy je poväčšine v jednotnom čísle, čiže vytvoríme schému Person k našej tabuľke.

Vytvoríme našu novú schému v lib/friends/person.ex:

defmodule Friends.Person do
  use Ecto.Schema

  schema "people" do
    field :name, :string
    field :age, :integer, default: 0
  end
end

Tu môžeme vidieť, že Friends.Person hovorí Ectu, že táto schéma popisuje tabuľku people a máme v nej dva stĺpce: reťazec name a celé čísloage s predvolenou hodnotou 0.

Spustime si príkazom iex -S mix konzolu a pozrime sa, ako vyzerá naša schéma. Vyskúšajme si vytvoriť novú osobu:

iex> %Friends.Person{}
%Friends.Person{age: 0, name: nil}

Ako sme očakávali, dostaneme štruktúru Person s predvolenou hodnotou pre atribút age. Teraz vytvorme “reálnu” osobu:

iex> person = %Friends.Person{name: "Tom", age: 11}
%Friends.Person{age: 11, name: "Tom"}

Keďže schémy sú len štruktúry, môžeme pristupovať k našim dátam ako sme zvyknutí:

iex> person.name
"Tom"
iex> Map.get(person, :name)
"Tom"
iex> %{name: name} = person
%Friends.Person{age: 11, name: "Tom"}
iex> name
"Tom"

Podobne, môžeme upravovať naše schémy, ako by sme robili s akoukoľvek inou mapou alebo štruktúrou v Elixire:

iex> %{person | age: 18}
%Friends.Person{age: 18, name: "Tom"}
iex> Map.put(person, :name, "Jerry")
%Friends.Person{age: 11, name: "Jerry"}

V ďalšej lekcii o Changesetoch sa pozrieme na to ako validovať zmeny našich dát a ako ich uložiť do databázy.

Caught a mistake or want to contribute to the lesson? Edit this page on GitHub!