Ecto @emjii
Topics Query Repo Model Changeset
Query
Query Based on LINQ Enabled by macros Database queries only
LINQ Language Integrated Query Released 2007 Supported in C#, F# and VB.net
LINQ from p in Post where p.id == 10 select new {p.title, p.contents}
LINQ from p in Post where p.id == 10 select new {p.title, p.contents} Post.Where(p => p.id == 10).Select(p => new {p.title, p.contents});
Query Based on LINQ Enabled by macros Database queries only
Query syntax from p in Post, where: "elixir" in p.tags, select: p
Query syntax from p in Post, where: "elixir" in p.tags, select: p
Query syntax from p in Post, where: "elixir" in p.tags, select: p
Query syntax from p in Post, where: "elixir" in p.tags, select: p
Interpolation from p in Post, where: ^tag in p.tags, select: p
Composing queries def elixir_posts do from p in Post, where: "elixir" in p.tags, select: p end
Paginate def elixir_posts(page, per_page) do offset = (page - 1) * per_page from p in Post, where: "elixir" in p.tags, offset: ^offset, limit: ^per_page, select: p end
Paginate def elixir_posts(page, per_page) do offset = (page - 1) * per_page from p in Post, where: "elixir" in p.tags, offset: ^offset, limit: ^per_page, select: p end
Paginate def paginate(query, page, per_page) do offset = (page - 1) * per_page from query, offset: ^offset, limit: ^per_page end elixir_posts > paginate(2, 30)
Scopes def admin(query) do from u in query, where: u.level == "admin" end
Scopes def admin(query), do: where(query, [u], u.level == "admin")
Queryable Protocol: to_query/1 First argument of from Implementations of Queryable - %Query{} - Atom (model) - Binary (source) - {source, model} tuples
Fragments from u in User, where: fragment("lower(?) = lower(?)", u.username, ^username)
Type checking Type check expressions Protect against inserting bad data
Repo
Repo Decoupled from models and queries All database actions goes through the repo - Repo.all(query) - Repo.insert(struct) - Repo.delete_all(query) Calls the database adapter
Adapters Pools connections with poolboy Ships with PostgreSQL & MySQL SQL Server support - hex.pm/packages/tds_ecto
Connection pooling #PID<0.57.0> #PID<0.58.0> #PID<0.59.0> #PID<0.60.0> #PID<0.56.0> #PID<0.61.0> MyRepo
Connection pooling #PID<0.57.0> #PID<0.58.0> #PID<0.59.0> #PID<0.60.0> #PID<0.56.0> #PID<0.61.0> MyRepo
Connection pooling #PID<0.59.0> #PID<0.57.0> #PID<0.60.0> #PID<0.56.0> #PID<0.61.0> MyRepo
Connection pooling #PID<0.57.0> #PID<0.62.0> #PID<0.59.0> #PID<0.60.0> #PID<0.56.0> #PID<0.61.0> MyRepo
Adapters Pools connections with poolboy Ships with PostgreSQL & MySQL SQL Server support - hex.pm/packages/tds_ecto
Model
Schema defmodule MyApp.Post do use Ecto.Model schema "posts" do field :title, :string field :content, :string end end
Callbacks before_insert :timestamp, [:insert] before_update :timestamp, [:update] defp timestamp(changeset, :insert), do: put_change(change, :inserted_at, DateTime.now) defp timestamp(changeset, :update), do: put_change(change, :updated_at, DateTime.now)
Associations schema "posts" do has_many :comments, MyApp.Comment has_one :link, MyApp.Permalink belongs_to :author, MyApp.User end
Query on associations from p in Post, preload: [:comments] from p in Post, preload: [comments: :likes] from p in Post, join: c in assoc(p, :comments), preload: [comments: c]
Changesets
Cast parameters Validate data Tracks changes Changesets
Changeset def changeset(user, params) do cast(user, params, ~w(name email)a, ~w(country)a) > validate_length(:name, min: 3) > validate_unique(:email) end
Changeset def changeset(user, params) do cast(user, params, ~w(name email)a, ~w(country)a) > validate_length(:name, min: 3) > validate_unique(:email) end
Changeset def changeset(user, params) do cast(user, params, ~w(name email)a, ~w(country)a) > validate_length(:name, min: 3) > validate_unique(:email) end def create(conn, params) do changeset = User.changeset(%User{}, params) if changeset.valid? do user = Repo.insert(changeset) send_ok(user) else send_validation_error(changeset.errors) end end
Ecto types Extends ecto s types Cast from input parameter to type Load and dump database values
Version type schema "releases" do field :app, :string field :version, HexWeb.Version field :checksum, :string field :has_docs, :boolean timestamps end #...
Version type defmodule HexWeb.Version do @behaviour Ecto.Type def type, do: :string def cast(%version{} = version), do: {:ok, version} def cast(string) when is_binary(string), do: Version.parse(string) def cast(_), do: :error def load(string), do: Version.parse(string) def dump(%version{} = version), do: {:ok, to_string(version)} end
Phoenix & Ecto phoenix_ecto project - hex.pm/packages/phoenix_ecto Implement protocols - HTML.FormData - HTML.Safe - Poison.Encoder - Plug.Exception
? @emjii