Rumah > Peranti teknologi > industri IT > Memahami Elixir ' s ecto pertanyaan DSL: asas -asas

Memahami Elixir ' s ecto pertanyaan DSL: asas -asas

William Shakespeare
Lepaskan: 2025-02-18 12:03:10
asal
1016 orang telah melayarinya

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:

  • ecto adalah DSL Elixir untuk interaksi pangkalan data, mencerminkan SQL.
  • Ia menawarkan sintaks Kata Kunci dan makro pertanyaan, bersamaan dengan fungsi tetapi berbeza dalam gaya.
  • fungsi teras seperti where, limit, offset, dan distinct membolehkan pemilihan data yang tepat.
  • Fungsi Agregasi (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:

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
Salin selepas log masuk

(MySQL digunakan di sini; sementara yang boleh disesuaikan dengan pangkalan data lain, beberapa contoh kemudian mungkin MySQL-spesifik.)

Skema pangkalan data:

Understanding Elixir's Ecto Querying DSL: The Basics

Pertanyaan Asas:

mari kita mulakan dengan pertanyaan mudah. Ingatlah untuk mengimport

dalam shell Elixir (Ecto.Query). iex -S mix

Ambil semua pengguna:

SQL:

ecto (sintaks kata kunci):
SELECT * FROM users;
Salin selepas log masuk

ecto (sintaks makro):
query = Ectoing.User
Ectoing.Repo.all(query)
Salin selepas log masuk

memilih medan tertentu (nama pertama, nama keluarga):
query = Ectoing.User |> Ecto.Query.all()
Ectoing.Repo.all(query)
Salin selepas log masuk

SQL:

ecto (sintaks kata kunci):

SELECT firstname, surname FROM users;
Salin selepas log masuk

ecto (sintaks makro):

query = from u in Ectoing.User, select: [u.firstname, u.surname]
Ectoing.Repo.all(query)
Salin selepas log masuk

Hasilnya akan menjadi senarai senarai, tuples, atau peta bergantung kepada struktur klausa

.
query = Ectoing.User |> Ecto.Query.select([u], [u.firstname, u.surname])
Ectoing.Repo.all(query)
Salin selepas log masuk

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):
SELECT * FROM users WHERE surname = "doe";
Salin selepas log masuk

Memilih nama keluarga yang berbeza, diperintahkan, dan terhad:
surname = "doe"
query = from u in Ectoing.User, where: u.surname == ^surname
Ectoing.Repo.all(query)
Salin selepas log masuk

SQL:

surname = "doe"
query = Ectoing.User |> Ecto.Query.where([u], u.surname == ^surname)
Ectoing.Repo.all(query)
Salin selepas log masuk
ecto (sintaks kata kunci):

ecto (sintaks makro):

SELECT DISTINCT surname FROM users LIMIT 3 ORDER BY surname;
Salin selepas log masuk

Pertanyaan Agregasi:
query = from u in Ectoing.User, select: u.surname, distinct: true, limit: 3, order_by: u.surname
Ectoing.Repo.all(query)
Salin selepas log masuk

Ecto menyokong fungsi agregasi.
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)
Salin selepas log masuk

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)

SELECT friend_id, avg(friend_rating) AS avg_rating
FROM friends
GROUP BY friend_id
HAVING avg_rating >= 4
ORDER BY avg_rating DESC;
Salin selepas log masuk
Kesimpulan:

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)
Salin selepas log masuk
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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan