Rumah >Peranti teknologi >industri IT >Memahami Elixir ' s ecto pertanyaan DSL: asas -asas
ecto pertanyaan dalam elixir: Panduan pemula
Artikel ini memperkenalkan bahasa pertanyaan Ecto, Elixir, membimbing anda melalui teknik pertanyaan asas. Kami akan meliputi gabungan, persatuan, pengagregatan, dan banyak lagi, dengan menganggap pemahaman asas mengenai fundamental elixir dan Ecto.
Konsep Utama:
where
, limit
, offset
, dan distinct
membolehkan pemilihan data yang tepat. group_by
, having
, count
, avg
, sum
, min
, max
) Dayakan pengiraan data kompleks. Bermula dengan aplikasi ectoing
:
Contoh menggunakan aplikasi ectoing
. Klon, sediakan, dan berhijrah pangkalan data seperti berikut:
<code class="language-bash">git clone https://github.com/tpunt/ectoing cd ectoing mix deps.get # Update credentials in config/config.exs mix ecto.create mix ecto.migrate mix run priv/repo/seeds.exs</code>
(MySQL digunakan di sini; sementara yang boleh disesuaikan dengan pangkalan data lain, beberapa contoh kemudian mungkin MySQL-spesifik.)
Skema pangkalan data:
Pertanyaan Asas:
mari kita mulakan dengan pertanyaan mudah. Ingatlah untuk mengimport dalam shell Elixir (Ecto.Query
). iex -S mix
SQL:
ecto (sintaks kata kunci):
<code class="language-sql">SELECT * FROM users;</code>
ecto (sintaks makro):
<code class="language-elixir">query = Ectoing.User Ectoing.Repo.all(query)</code>
memilih medan tertentu (nama pertama, nama keluarga):
<code class="language-elixir">query = Ectoing.User |> Ecto.Query.all() Ectoing.Repo.all(query)</code>
SQL:
ecto (sintaks kata kunci):
<code class="language-sql">SELECT firstname, surname FROM users;</code>
ecto (sintaks makro):
<code class="language-elixir">query = from u in Ectoing.User, select: [u.firstname, u.surname] Ectoing.Repo.all(query)</code>
Hasilnya akan menjadi senarai senarai, tuples, atau peta bergantung kepada struktur klausa
.<code class="language-elixir">query = Ectoing.User |> Ecto.Query.select([u], [u.firstname, u.surname]) Ectoing.Repo.all(query)</code>
select
penapisan dan penyesuaian hasil:
mari memperbaiki pertanyaan untuk memilih subset data. memilih pengguna dengan nama keluarga "Doe":
SQL:
ecto (sintaks kata kunci):
ecto (sintaks makro):
<code class="language-sql">SELECT * FROM users WHERE surname = "doe";</code>
Memilih nama keluarga yang berbeza, diperintahkan, dan terhad:
<code class="language-elixir">surname = "doe" query = from u in Ectoing.User, where: u.surname == ^surname Ectoing.Repo.all(query)</code>
SQL:
<code class="language-elixir">surname = "doe" query = Ectoing.User |> Ecto.Query.where([u], u.surname == ^surname) Ectoing.Repo.all(query)</code>ecto (sintaks kata kunci):
ecto (sintaks makro):
<code class="language-sql">SELECT DISTINCT surname FROM users LIMIT 3 ORDER BY surname;</code>
Pertanyaan Agregasi:
<code class="language-elixir">query = from u in Ectoing.User, select: u.surname, distinct: true, limit: 3, order_by: u.surname Ectoing.Repo.all(query)</code>
Ecto menyokong fungsi agregasi.
<code class="language-elixir">query = Ectoing.User |> Ecto.Query.select([u], u.surname) |> Ecto.Query.distinct(true) |> Ecto.Query.limit(3) |> Ecto.Query.order_by([u], u.surname) Ectoing.Repo.all(query)</code>
Mencari pengguna dengan penilaian rakan rata -rata 4 atau lebih besar:
SQL:
ecto (sintaks kata kunci):
ecto (sintaks makro): (struktur yang serupa dengan sintaks kata kunci, menggunakan operator paip)
<code class="language-sql">SELECT friend_id, avg(friend_rating) AS avg_rating FROM friends GROUP BY friend_id HAVING avg_rating >= 4 ORDER BY avg_rating DESC;</code>Kesimpulan:
<code class="language-elixir">query = from f in Ectoing.Friend, select: %{friend_id: f.friend_id, avg_rating: avg(f.friend_rating)}, group_by: f.friend_id, having: avg(f.friend_rating) >= 4, order_by: [desc: avg(f.friend_rating)] Ectoing.Repo.all(query)</code>Pengenalan ini meliputi asas -asas pertanyaan Ecto. Langkah seterusnya melibatkan meneroka gabungan, pertanyaan kompleks, dan teknik lanjutan. Rujuk dokumentasi ECTO untuk panduan komprehensif.
Atas ialah kandungan terperinci Memahami Elixir ' s ecto pertanyaan DSL: asas -asas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!