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
830
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
136
6.6k
Bootstrap
vanstee
8
710
HTTP API Design for iOS Applications
vanstee
11
550
Consensus: An Introduction to Raft
vanstee
22
2.8k
Convergent Replicated Data Types
vanstee
4
670
Pour Over Brewing Method
vanstee
1
290
Celluloid & DCell
vanstee
4
470
Map Reduce & Ruby
vanstee
10
700
Other Decks in Technology
See All in Technology
不要なリソースを自動で定期的に整理する方法 ~Sandboxアカウントのコストを削減しよう!~
amixedcolor
3
150
コード✕AIーソフトウェア開発者のための生成AI実践入門~
yuhattor
4
890
Azure App Service on Linux の Sidecar に Phi-3 を配置してインテリジェントなアプリケーションを作ってみよう/jazug-anniv14
thara0402
0
550
Case Study: Concurrent Counting
ennael
PRO
0
130
Graph Database と Generative AI の素敵な関係
oracle4engineer
PRO
16
2.9k
WSUSが非推奨に!? Windowsの更新管理を改めて勉強する!
ebibibi
0
400
品質マネジメントで抑えておきたい2つのリスクを見分けて未来に備えよう #yapcjapan
makky_tyuyan
0
130
入門 バックアップ
ryuichi1208
18
7.3k
Databricks Appのご紹介
databricksjapan
0
410
LINEヤフー新卒採用 コーディングテスト解説 アルゴリズム問題編
lycorp_recruit_jp
0
14k
SageMaker学習のツボ / The Key Points of Learning SageMaker
cmhiranofumio
0
230
地域DXにおけるGrafana活用事例
wacky
0
280
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Facilitating Awesome Meetings
lara
49
6k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
30
1.7k
Web development in the modern age
philhawksworth
205
10k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
22k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
59k
How to name files
jennybc
77
99k
The Cost Of JavaScript in 2023
addyosmani
43
5.9k
The Art of Programming - Codeland 2020
erikaheidi
51
13k
Atom: Resistance is Futile
akmur
261
25k
4 Signs Your Business is Dying
shpigford
180
21k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
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
?