Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Elixir and Ecto
Search
Patrick Van Stee
October 03, 2013
Technology
5
750
Elixir and Ecto
Patrick Van Stee
October 03, 2013
Tweet
Share
More Decks by Patrick Van Stee
See All by Patrick Van Stee
Raft: Consensus for Rubyists
vanstee
133
6.3k
Bootstrap
vanstee
8
680
HTTP API Design for iOS Applications
vanstee
11
500
Consensus: An Introduction to Raft
vanstee
22
2.7k
Convergent Replicated Data Types
vanstee
4
620
Pour Over Brewing Method
vanstee
1
250
Celluloid & DCell
vanstee
4
420
Map Reduce & Ruby
vanstee
10
630
Other Decks in Technology
See All in Technology
プロファイラを使ってPythonアプリをチューニングしよう
tokibito
2
270
Mutation Testingを活用して テスト品質を考える /introduction to mutation testing
kakehashi
3
380
継続性視点での開発生産性マネジメント / Managing Engineering Organization in a Strategic Way
sms_tech
10
1.6k
Databricksのご紹介
taka_aki
1
280
MySQL 8.4 LTS が あらわれた
yoku0825
PRO
1
110
静的解析ツールの刷新に向けた取り組み
suginao
1
150
온디바이스 AI 및 로컬 AI의 도전 과제 / Challenges of On-Device AI and Local AI
inureyes
PRO
0
780
BigQuery データ キャンバスでデータモデリングしてみた / I tried data modeling with BigQuery Data Canvas
sansan_randd
4
650
機械学習モデルの運用と実用的なアプローチ
databricksjapan
0
190
JAWS-UGの楽しみ方
schwrzktz
1
230
事業価値を生み出すモデリング 価値をサステナブルにするアーキテクチャ
littlehands
6
930
OpenStack再入門「ネットワーク編」
kajinamit
0
250
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
16
2.1k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
323
20k
Learning to Love Humans: Emotional Interface Design
aarron
268
39k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
The Illustrated Children's Guide to Kubernetes
chrisshort
32
47k
Robots, Beer and Maslow
schacon
PRO
155
8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
650
58k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
Making Projects Easy
brettharned
109
5.6k
Optimizing for Happiness
mojombo
372
69k
Principles of Awesome APIs and How to Build Them.
keavy
121
16k
Transcript
elixir atlanta meetup
meetup.com/ atlantaelixir @vanstee
None
• speakers • sponsors • twitter • website • github
org • [your great idea]
elixir and ecto
Elixir is a functional, meta-programming aware language built on top
of the Erlang VM.
elixir-lang/elixir @josevalim
defmodule Hello do IO.puts "Before world defined" def world do
IO.puts "Hello World" end IO.puts "After world defined" end Hello.world HELLO.EX
None
Types
# tuple { :a, :b, :c } # list [1,
2, 3] [a: 1, b: 2, c: 3] # record defrecord User, name: "", age: nil User.new(name: "Patrick", age: 25) TYPE.EX
Pattern Matching
# assignment a = 1 # => 1 # matching
1 = a # => 1 2 = a # => ** (MatchError) ... { ^a, b } = { 1, 2 } # b => 2 [head | _] = [1, 2, 3] # head => 1 PATTERN.EX
case { 1, 2, 3 } do { 4, 5,
6 } -> "This won't match" { 1, x, 3 } when x > 0 -> "This will match and assign x" _ -> "No match" end GUARD.EX
Processes
current_pid = self spawn fn -> current_pid <- :hello end
receive do :hello -> IO.puts "Hello World" end PROCESS.EX
defmodule Stacker.Supervisor do use Supervisor.Behaviour def start_link(stack) do :supervisor.start_link(__MODULE__, stack)
end def init(stack) do children = [worker(Stacker.Server, [stack])] supervise children, strategy: :one_for_one end end SUPERVISOR.EX
Protocols Macros DocTest and lots more
elixir-lang.org #elixir-lang
None
None
ecto database query DSL
elixir-lang/ecto @ericmj
defmodule User do use Ecto.Model queryable "user" do field :name,
:string end end MODEL.EX
defmodule FindUser do import Ecto.Query def find_by_name(name) do query =
from u in User, where: u.name == ^name, limit: 1 Repo.all(query) end end QUERY.EX
None
Repo
• wrapper • holds connections • executes queries • supervised
worker
defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres def url do
"ecto://user:pass@localhost/db" end end Repo.all(...) Repo.create(...) Repo.update(...) Repo.delete(...) REPO.EX
Entity
• fields • associations • elixir record
defmodule User do use Ecto.Model queryable "user" do field :name,
:string field :password, :string, default: "secret" has_many :projects, Project end end MODEL.EX
Query
• relational algebra • extendable • macros • keyword lists
def paginate(query, page, size) do extend query, limit: size, offset:
(page - 1) * size end query = FindUser.find_by_state("GA") query |> paginate(1, 50) |> Repo.all PAGINATE.EX
from u in User, where: u.name == ^name, limit: 1
QUERY.EX
from(u in User) |> where([u], u.name == ^name) |> limit(1)
|> select([u], u) QUERY.EX
select( limit( where( from(u in User), [u], u.name == ^name
), 1 ), [u], u ) QUERY.EX
Gotchas
• error messages • validations • callbacks • type conversions
• SQL migrations • missing mix tasks
elixir-lang/ecto examples/simple
Thanks! @josevalim @ericmj #elixir-lang
?