Rumah >Peranti teknologi >industri IT >Perpustakaan Ecto

Perpustakaan Ecto

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌asal
2025-02-18 09:38:10171semak imbas

Perpustakaan Ecto

Elixir adalah bahasa pengaturcaraan moden, dinamik, berfungsi yang digunakan untuk membina aplikasi yang sangat diedarkan dan bersalah. ECTO adalah perpustakaan utamanya untuk bekerja dengan pangkalan data, memberikan kami alat untuk berinteraksi dengan pangkalan data di bawah API biasa, versi pangkalan data bersama aplikasi kami, dan mengendalikan pemprosesan data dalam aplikasi kami.

Artikel ini melihat dengan cepat aspek utama Perpustakaan ECTO. Walaupun ia ditulis untuk Ecto 1.x, contoh -contoh dalam artikel ini disesuaikan dengan Ecto 2, dan di mana percanggahan terletak, mereka disebutkan. Pengetahuan asas elixir dan campuran diandaikan.

Takeaways Key

Ecto adalah perpustakaan yang mantap di Elixir untuk mengendalikan operasi pangkalan data, menyediakan API biasa untuk interaksi pangkalan data, versi, dan pemprosesan data.
  • Proses persediaan melibatkan membuat aplikasi campuran baru, mengkonfigurasi kebergantungan, dan mengintegrasikan modul repositori ECTO ke dalam pokok pengawasan aplikasi untuk pengurusan pangkalan data yang berkesan.
  • Ciri -ciri Migrasi ECTO membolehkan versi pangkalan data bersama kod aplikasi, memudahkan perubahan pengesanan dan penggunaan keadaan pangkalan data yang berbeza.
  • skema dan perubahan ECTO adalah penting untuk menentukan struktur data dan pengendalian pengesahan data, memastikan bahawa hanya data yang sah dimanipulasi dan disimpan.
  • Artikel menunjukkan membina aplikasi CRUD yang mudah menggunakan ECTO, menggambarkan cara melakukan operasi pangkalan data seperti membuat, membaca, mengemaskini, dan memadam rekod.
  • Aplikasi
Kami akan membina aplikasi yang sangat mudah dari awal yang akan menyimpan dan mengambil nota untuk kami. Dengan melakukan ini, kita akan melihat setiap empat komponen utama ECTO: repos, skema, perubahan, dan pertanyaan.

Membuat aplikasi baru

mari kita mulakan dengan menghasilkan aplikasi campuran baru:

Bendera -S -up menghasilkan beberapa kod boilerplate tambahan yang diperlukan untuk aplikasi OTP. Permohonan ini perlu mempunyai pokok penyeliaan, kerana ECTO memerlukannya (lebih banyak lagi dalam satu minit).

mix new notex <span>--sup
</span>
Menyediakan kebergantungan

Sekarang, mari kita kemas kini fail Mix.exs kami dengan beberapa kebergantungan aplikasi. Untuk ini, kami akan mahu menentukan Ecto dan salah satu penyesuainya. Saya telah memilih untuk menggunakan MySQL untuk ini, jadi kita perlu menentukan Perpustakaan Mariaex (ECTO menyokong beberapa pangkalan data).

Kemas kini fungsi aplikasi/0 dalam fail mix.exs dengan yang berikut:

dan kemas kini DEPS/0 dengan yang berikut:

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>

sekarang mengambil kebergantungan dengan campuran deps.get.

defp deps <span>do
</span>  <span>[{:ecto, <span>"~> 1.1.5"</span>}, # or "~> 2.0" for Ecto 2
</span>   <span>{:mariaex, <span>"~> 0.6.0"</span>}] # or "~> 0.7.0" for Ecto 2
</span><span>end
</span>
Seterusnya, kita perlu mengintegrasikan kebergantungan ini ke dalam aplikasi kami. Ini akan melibatkan mewujudkan modul pembalut baru untuk repositori ECTO, mengemas kini pokok pengawasan aplikasi kami untuk memulakan dan mengawasi modul baru, dan mengkonfigurasi maklumat sambungan penyesuai.

mari pertama mulakan dengan menentukan modul notex.repo di lib/notex/repo.ex dengan kod berikut:

mix new notex <span>--sup
</span>

Lokasi modul ini (lib/app_name/repo.ex) adalah konvensional. Bila -bila masa kami menggunakan perintah campuran Ecto, ia akan lalai untuk mencari repositori yang ditentukan di appname.repo. Kami boleh meletakkannya di tempat lain, tetapi ia akan menjadi kesulitan untuk menentukan lokasinya menggunakan bendera -r (atau -repo).

Modul Notex.repo di atas membolehkan kami bekerja dengan pangkalan data menggunakan ECTO. Ia melakukan ini dengan fungsi suntikan pertama dari modul repo ECTO (yang menyediakan API pertanyaan pangkalan data) dan dengan menamakan aplikasi OTP kami sebagai: NotEx.

Repositori Ecto memberikan kami antara muka yang sama untuk berinteraksi dengan pangkalan data yang mendasari (yang diputuskan oleh penyesuai yang digunakan). Oleh itu, sementara Ecto menggunakan repo terminologi, ia tidak mengikuti corak reka bentuk repositori, kerana ia pembungkus di sekitar pangkalan data, bukan jadual.

Sekarang kita telah menentukan modul Notex.repo, kita mesti menambah ini ke pokok penyeliaan kita dalam modul NOTEX (di lib/notex.ex). Kemas kini fungsi Start/2 dengan yang berikut:

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>

kami telah menambah modul Notex.repo sebagai penyelia kanak -kanak (kerana ia sendiri merupakan aplikasi OTP yang menyelia). Ini bermakna ia akan diawasi oleh permohonan OTP kami, dan permohonan kami akan bertanggungjawab untuk memulakannya semasa permulaan permohonan.

setiap sambungan yang dibuat dengan Ecto menggunakan proses yang berasingan (di mana proses ditarik dari kolam proses menggunakan perpustakaan yang dipanggil Poolboy). Ini dilakukan supaya pertanyaan kami dapat melaksanakan secara serentak, dan juga berdaya tahan dari kegagalan (mis. Timeouts). Oleh itu, permohonan kami memerlukan OTP, kerana ECTO mempunyai proses sendiri yang memerlukan penyeliaan (termasuk pokok pengawasan yang menyelia sekumpulan sambungan pangkalan data). Ini dapat dilihat menggunakan perpustakaan pemerhati Erlang, yang membolehkan kita memvisualisasikan proses dalam aplikasi.

Setelah menambah repo ke proses pekerja kami untuk diawasi, kami perlu mengkonfigurasi penyesuai akhirnya supaya ia dapat berkomunikasi dengan pangkalan data kami. Letakkan kod berikut pada akhir fail `config/config.exs` (mengemas kini butiran yang diperlukan):
mix new notex <span>--sup
</span>
Di sini, kami menentukan nama aplikasi OTP kami (: NOTEX) dan nama modul kami yang baru ditakrifkan (NOTEX.REPO) untuk membolehkan komunikasi dengan pangkalan data. Pilihan konfigurasi yang lain harus cukup jelas. ECTO 2 menghendaki kami juga menentukan senarai repos ECTO yang kami gunakan dalam aplikasi kami.

Ecto sebenarnya memberikan kita pintasan untuk menubuhkan modul repo di atas sebagai tugas campuran: campuran ecto.gen.repo. Ini menjana modul repositori untuk kami dan mengemas kini fail config.exs dengan beberapa konfigurasi asas (modul repo masih perlu ditambah secara manual ke pokok pengawasan walaupun). Saya mengelakkan menggunakannya di sini terutamanya untuk alasan didaktik untuk menunjukkan cara untuk menubuhkan Ecto secara manual (itu, dan hakikat bahawa penjana repo menganggap anda menggunakan postgres, jadi kita perlu mengemas kini penyesuai dalam konfigurasi pula).

Sebelum bergerak, mari kita lihat dengan cepat pada hierarki proses. .

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
menavigasi ke tab Aplikasi, kita dapat melihat proses aplikasi, termasuk yang mana penyelia:

Perpustakaan Ecto Jadi itulah sebabnya aplikasi ini perlu menjadi aplikasi OTP. Tetapi itu sejauh ini lubang arnab kita akan pergi berkenaan dengan proses dan OTP dalam artikel ini. Mereka akan ditutup dengan lebih terperinci dalam artikel kemudian yang akan datang.

Membuat pangkalan data dan jadual

Sekarang dengan persediaan itu, kami boleh membuat pangkalan data dan jadual kami. Untuk membuat pangkalan data, jalankan arahan berikut:

Untuk membuat jadual, kami akan menggunakan ciri migrasi Ecto. Migrasi membolehkan kita untuk versi pangkalan data bersama kod sumber, membolehkan perubahan dijejaki dan negara -negara yang berbeza digunakan. Oleh itu, kami membuat migrasi baru setiap kali kami ingin mengubah struktur pangkalan data.
defp deps <span>do
</span>  <span>[{:ecto, <span>"~> 1.1.5"</span>}, # or "~> 2.0" for Ecto 2
</span>   <span>{:mariaex, <span>"~> 0.6.0"</span>}] # or "~> 0.7.0" for Ecto 2
</span><span>end
</span>

Penghijrahan baru boleh dibuat dengan perintah campuran ecto.gen.migrasi seperti berikut:

di atas harus membuat folder migrasi baru di priv/repo/migrasi, serta fail penghijrahan baru. Fail ini dipraktikkan dengan tarikh dan masa yang dibuat (untuk pesanan direktori mudah), bersama dengan nama penghijrahan kami. Buka fail itu dan ubah suai kepada yang berikut:
defmodule Notex<span>.Repo do
</span>  use Ecto<span>.Repo, otp_app: :notex
</span><span>end
</span>
mix new notex <span>--sup
</span>

Menjaga perkara yang mudah, kami menggunakan makro Create untuk menentukan jadual baru (dipanggil nota) dengan dua bidang: note_name dan note_content. Kunci utama dibuat secara automatik untuk kami (bernama ID). Walaupun kedua -dua bidang kami ditakrifkan sebagai rentetan mudah, Ecto menyokong banyak jenis - yang boleh anda periksa dalam dokumentasinya.

Dengan penghijrahan kami selesai, kami kini boleh menjalankan penghijrahan dengan arahan berikut:

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>

ini akan membuat jadual nota kami dengan 3 medan (medan ketiga menjadi ID, kunci utama).

Dengan jadual yang dibuat, kini sudah tiba masanya untuk membuat model untuk jadual. Model ini digunakan untuk menentukan bidang meja dan jenis masing -masing. Ini akan digunakan oleh aplikasi dan DSL pertanyaan ECTO apabila menghantar dan mengesahkan data. Definisi model juga mungkin mengandungi medan maya (tidak seperti definisi penghijrahan), yang digunakan untuk memegang data yang biasa -biasa saja yang kita tidak mahu bertahan (seperti kata laluan yang tidak dicuci).

Dalam bentuk yang paling asas, model notex.note kami (terletak di lib/notex/note.ex) akan kelihatan seperti berikut:

defp deps <span>do
</span>  <span>[{:ecto, <span>"~> 1.1.5"</span>}, # or "~> 2.0" for Ecto 2
</span>   <span>{:mariaex, <span>"~> 0.6.0"</span>}] # or "~> 0.7.0" for Ecto 2
</span><span>end
</span>

Kami menyuntik modul ecto.schema supaya kami dapat menggunakan makro skema untuk menentukan bidang dan jenis mereka. Definisi ini akan menjadi penting kemudian apabila kami menggunakan perubahan Ecto. Sesuatu yang lain Skema Macro lakukan untuk kami adalah menentukan struktur jenis sebagai modul semasa (dalam kes ini, ia adalah %notex.note {}). Struktur ini akan membolehkan kita membuat perubahan baru (lebih lanjut mengenai ini tidak lama lagi) dan memasukkan data ke dalam jadual.

dengan hanya di atas, kita boleh membakar IEX dan mula menanyakan pangkalan data kami:

defmodule Notex<span>.Repo do
</span>  use Ecto<span>.Repo, otp_app: :notex
</span><span>end
</span>

(Maklumat Debugging Console Redacted.)

Modul pertanyaan ECTO diimport untuk membuat semua makro DSL pertanyaan (seperti dari) yang tersedia untuk kami di dalam shell. Kami kemudian membuat pertanyaan mudah untuk mengembalikan semua rekod (menggunakan semua/1), memilih hanya medan note_name. Ini mengembalikan senarai kosong, kerana kami tidak mempunyai rekod dalam pangkalan data. Mari buat perubahan baru dan masukkannya ke dalam jadual:

<span>def <span>start</span>(_type, _args) do
</span>  import Supervisor<span>.Spec, warn: false
</span>
  children <span>= [
</span>    supervisor<span>(Notex.Repo, []),
</span>  <span>]
</span>
  opts <span>= [strategy: :one_for_one, name: Notex.Supervisor]
</span>  Supervisor<span>.start_link(children, opts)
</span><span>end
</span>

(Maklumat Debugging Console Redacted.)

kita mulakan dengan mengimport ecto.Query sekali lagi, yang diperlukan untuk operasi terakhir (khusus untuk dari makro). Kami kemudian menggunakan fungsi Perubahan/1 dari ecto.Changeset untuk membuat perubahan baru menggunakan notex.note {} struct. Perubahan ini kemudian dimasukkan, dan kemudian diambil.

perubahan adalah apa yang kita gunakan ketika bekerja dengan rekod. Mereka membolehkan kita mengesan perubahan kepada data sebelum dimasukkan, serta mengesahkan perubahan tersebut dan menghantar nilai mereka kepada jenis data yang betul (mengikut definisi skema kami). Seperti yang dapat kita lihat dari atas, struktur �to.changeset {} mengandungi sejumlah ahli yang akan berguna untuk melihat jika perubahan itu sah (changeet.valid?), Apa kesilapan jika mereka tidak (changetet .errors), dan sebagainya.

mari kita mengemas kini model notex.note untuk menunjukkan beberapa perubahan dan operasi pertanyaan, sejak melaksanakannya di IEX mendapat sedikit kemas:

mix new notex <span>--sup
</span>

mari kita melalui setiap lima fungsi baru. Fungsi Insert_Note/1 mencipta nota baru untuk kami. Fungsi pelakon/4 mengendalikan pemutus data dari medan input ke jenis medan masing -masing (mengikut definisi skema kami), serta memastikan bahawa semua bidang yang diperlukan mempunyai nilai. Perubahan yang dikembalikan dari cast/4 kemudian dimasukkan ke dalam pangkalan data. Perhatikan bahawa dalam Ecto 2, fungsi Cast/3 dan Validate_Required/3 harus digunakan dan bukannya Cast/4.

fungsi get_notes/0 mengembalikan senarai tupel semua nota dalam jadual. Ini dilakukan melalui pencocokan corak dalam pernyataan pilih. .

fungsi get_note/1 mengambil satu nota tunggal dari jadual mengikut id nota. Ini dilakukan melalui GET! fungsi, yang sama ada mengembalikan nota apabila berjaya atau melemparkan kegagalan.

fungsi update_note/1 mengemas kini nota mengikut ID nota yang dibekalkan. Perhatikan kekunci rentetan dalam peta tandatangan fungsi (kekunci ID). Ini adalah konvensyen yang saya ambil dari rangka kerja Phoenix, di mana data yang tidak berasas (biasanya pengguna dibekalkan) diwakili dalam peta dengan kekunci rentetan, dan data sanitized diwakili dalam peta dengan kekunci atom. Untuk melaksanakan kemas kini, kami mula -mula mengambil nota mengikut IDnya dari pangkalan data, kemudian gunakan fungsi Cast/4 untuk memohon perubahan pada rekod sebelum akhirnya memasukkan perubahan yang dikemas kini kembali ke pangkalan data.

fungsi Delete_Note/1 membuang nota dari pangkalan data. Kami mula -mula mengambil nota dari pangkalan data melalui IDnya (sama dengan fungsi update_note/1), dan kemudian padamkannya menggunakan struktur nota yang dikembalikan.

Dengan operasi CRUD di atas, mari kita melompat kembali ke IEX dan mencubanya:

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
(Maklumat Debugging Console Redacted.)

dan di sana kami memilikinya, aplikasi CRUD asas menggunakan ECTO! Kita boleh menjadikan output dan menjadikan API lebih baik untuk menanyakan, tetapi saya akan meninggalkannya sebagai lanjutan, kerana mereka adalah tangen terhadap apa yang kita tutupi (dan artikel ini cukup lama, saya fikir).

Kesimpulan

Artikel ini telah melihat asas -asas Ecto dengan membuat aplikasi CRUD mudah dari awal. Kami telah melihat banyak kebolehan Ecto Packs untuk menguruskan rekod dan perubahan pangkalan data, termasuk migrasi, skema, dan DSL pertanyaannya, bersama -sama dengan menyentuh topik tangen seperti OTP. Saya harap ini telah menjadi primer yang baik bagi mereka yang ingin bangun untuk mempercepatkan bekerja dengan pangkalan data di Elixir!

Dalam artikel saya yang seterusnya, saya melihat asas -asas Elixir's Ecto Query DSL.

Soalan Lazim (Soalan Lazim) Mengenai Perpustakaan ELIXIR

Apakah tujuan Perpustakaan ELIXIR ELIXIR? Ia direka untuk mengendalikan semua tugas manipulasi data dalam aplikasi, menyediakan API bersatu untuk berinteraksi dengan pangkalan data. ECTO membolehkan anda membuat, membaca, mengemas kini, dan memadam rekod, serta melakukan pertanyaan, transaksi, dan migrasi yang kompleks. Ia menyokong pangkalan data yang berbeza, termasuk PostgreSQL dan MySQL, menjadikannya alat yang serba boleh bagi mana -mana pemaju Elixir. . Perubahan adalah struktur data yang memegang perubahan yang akan dibuat ke pangkalan data, bersama -sama dengan kesilapan, pengesahan, dan jenis maklumat pemutus. Perubahan Memastikan hanya data yang sah disimpan ke pangkalan data, memberikan mekanisme yang mantap untuk pengesahan data dan pengendalian ralat. Itu membolehkan anda menulis pertanyaan kompleks dengan cara yang boleh dibaca dan cekap. Anda boleh menggunakan kata kunci dari kata kunci untuk memulakan pertanyaan, dan rantai fungsi lain seperti pilih, di mana, order_by, dan bergabung untuk membina pertanyaan. Ecto juga menyokong subqueries, agregasi, dan ciri -ciri SQL lanjutan yang lain. data. Ia memetakan data dari aplikasi Elixir anda ke jadual pangkalan data anda dan sebaliknya. Dengan ecto.schema, anda boleh menentukan bidang data anda, jenis mereka, dan sebarang persatuan antara skema yang berbeza. untuk mengendalikan migrasi pangkalan data. Migrasi adalah skrip yang mengubah struktur pangkalan data anda dari masa ke masa. Mereka boleh membuat atau menjatuhkan jadual, menambah atau mengeluarkan lajur, membuat indeks, dan sebagainya. Ciri penghijrahan Ecto memastikan bahawa perubahan ini dilakukan dengan cara yang terkawal dan boleh diterbalik pangkalan data melalui penggunaan penyesuai. Walau bagaimanapun, beberapa ciri seperti migrasi dan pertanyaan yang kompleks mungkin tidak disokong sepenuhnya atau mungkin berfungsi secara berbeza bergantung pada pangkalan data NoSQL tertentu dan penyesuai yang digunakan. dan API yang kuat untuk mengendalikan transaksi. Anda boleh menggunakan fungsi ecto.repo.Transaction untuk memulakan urus niaga, dan sebarang perubahan yang dibuat dalam transaksi akan komited ke pangkalan data jika fungsi kembali: OK, atau digulung jika ia kembali: Ralat.

Apakah ecto.multi?

ecto.Multi adalah ciri ECTO yang membolehkan anda mengumpulkan pelbagai operasi bersama -sama. Ia berguna apabila anda perlu melakukan pelbagai operasi dalam satu transaksi, dan anda mahu semuanya berjaya atau gagal secara keseluruhan. Ecto.Multi Memastikan konsistensi data dan membuat pengendalian ralat lebih mudah. Phoenix menggunakan ECTO untuk semua keperluan manipulasi datanya, dan menyediakan penjana yang memudahkan untuk membuat skema ECTO, perubahan, dan migrasi. Anda juga boleh menggunakan API pertanyaan ECTO secara langsung dalam pengawal dan pandangan Phoenix anda. Ia menyediakan panduan yang komprehensif untuk semua ciri ECTO, bersama -sama dengan contoh dan amalan terbaik. Anda juga boleh menemui banyak tutorial dan catatan blog dalam talian yang meliputi pelbagai aspek ECTO dengan lebih terperinci.

Atas ialah kandungan terperinci Perpustakaan Ecto. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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 sebelumnya:Pengenalan kepada OSVRArtikel seterusnya:Pengenalan kepada OSVR