Skip to content

Latest commit

 

History

History

nebulex_ecto_example

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Nebulex and Ecto Integration Example

This example illustrates how to integrate Nebulex and Ecto extremely easy, using declarative annotation-based caching via decorators.

See also Cache Usage Patterns

Getting started

First of all, let's setup the database:

$ mix ecto.create && mix ecto.migrate

Now we have the database setup and ready to be used.

Open an interactive Elixir console:

iex -S mix

Let's play a bit:

iex(1)> alias NebulexEctoExample.Person
NebulexEctoExample.Person

iex(2)> person = %Person{first_name: "Carlos", last_name: "Bolanos", age: 33}
%NebulexEctoExample.Person{
  __meta__: #Ecto.Schema.Metadata<:built, "people">,
  age: 33,
  first_name: "Carlos",
  id: nil,
  last_name: "Bolanos"
}

iex(3)> NebulexEctoExample.get_person(1)

15:45:25.700 [debug] QUERY OK source="people" db=2.3ms
SELECT p0."id", p0."first_name", p0."last_name", p0."age" FROM "people" AS p0 WHERE (p0."id" = $1) [1]
nil

iex(4)> NebulexEctoExample.Cache.get({Person, 1})
nil

iex(5)> {:ok, person} = NebulexEctoExample.Repo.insert(person)

17:37:42.531 [debug] QUERY OK db=1.4ms queue=1.0ms
INSERT INTO "people" ("age","first_name","last_name") VALUES ($1,$2,$3) RETURNING "id" [33, "Carlos", "Bolanos"]
{:ok,
 %NebulexEctoExample.Person{
   __meta__: #Ecto.Schema.Metadata<:loaded, "people">,
   age: 33,
   first_name: "Carlos",
   id: 1,
   last_name: "Bolanos"
 }}

iex(6)> NebulexEctoExample.get_person(1)

17:38:14.215 [debug] QUERY OK source="people" db=0.6ms
SELECT p0."id", p0."first_name", p0."last_name", p0."age" FROM "people" AS p0 WHERE (p0."id" = $1) [1]
%NebulexEctoExample.Person{
  __meta__: #Ecto.Schema.Metadata<:loaded, "people">,
  age: 33,
  first_name: "Carlos",
  id: 1,
  last_name: "Bolanos"
}

iex(7)> NebulexEctoExample.Cache.get({Person, 1})
%NebulexEctoExample.Person{
  __meta__: #Ecto.Schema.Metadata<:loaded, "people">,
  age: 33,
  first_name: "Carlos",
  id: 1,
  last_name: "Bolanos"
}

So far seems to be working as expected, let's force some evictions:

iex(8)> person = NebulexEctoExample.update_person!(person, %{last_name: "Andres"})

17:43:07.091 [debug] QUERY OK db=1.3ms queue=1.3ms
UPDATE "people" SET "last_name" = $1 WHERE "id" = $2 ["Andres", 1]
%NebulexEctoExample.Person{
  __meta__: #Ecto.Schema.Metadata<:loaded, "people">,
  age: 33,
  first_name: "Carlos",
  id: 1,
  last_name: "Andres"
}

iex(11)> NebulexEctoExample.Cache.get({Person, 1})
%NebulexEctoExample.Person{
  __meta__: #Ecto.Schema.Metadata<:loaded, "people">,
  age: 33,
  first_name: "Carlos",
  id: 1,
  last_name: "Andres"
}

iex(12)> NebulexEctoExample.delete_person(person)

17:44:39.473 [debug] QUERY OK db=1.5ms queue=1.7ms
DELETE FROM "people" WHERE "id" = $1 [1]
{:ok,
 %NebulexEctoExample.Person{
   __meta__: #Ecto.Schema.Metadata<:deleted, "people">,
   age: 33,
   first_name: "Carlos",
   id: 1,
   last_name: "Andres"
 }}

iex(13)> NebulexEctoExample.Cache.get({Person, 1})
nil

Now you can continue testing more functions!