Rumah >Peranti teknologi >industri IT >Perpustakaan Ecto
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
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).
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:
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
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
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!