ecto庫

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-18 09:38:10
原創
175 人瀏覽過

ecto庫

lixir是一種現代,動態,功能性的編程語言,用於構建高度分佈和容忍故障的應用程序。 ECTO是其主要庫,用於使用數據庫,為我們提供了與Common API下的數據庫進行交互的工具,將數據庫與我們的應用程序旁邊的數據庫進行版本,並在應用程序中處理數據處理。

>本文快速查看ECTO庫的主要方面。雖然它是為ECTO 1.X編寫的,但本文中的示例與ECTO 2兼容,並且在差異所在的位置,則提到了它們。假定長生不老藥和混合的基本知識。

鑰匙要點

> ecto是用於處理數據庫操作的長生不老藥中的一個強大庫,為數據庫交互,版本控制和數據處理提供了通用的API。
    >
  • 設置過程涉及創建一個新的混合應用程序,配置依賴項並將ECTO存儲庫模塊集成到應用程序的監督樹中以進行有效的數據庫管理。
  • > ecto的遷移功能允許在應用程序代碼旁邊對數據庫進行版本處理,從而促進更改跟踪和應用不同數據庫狀態的應用。
  • > ECTO模式和更改集對於定義數據結構和處理數據驗證至關重要,確保僅操縱和存儲有效的數據。
  • >本文演示了使用eTo構建一個簡單的CRUD應用程序,說明瞭如何執行數據庫操作,例如創建,閱讀,更新和刪除記錄。
  • >
  • 應用程序
  • >我們將構建一個非常簡單的應用程序,可以為我們存儲並檢索筆記。通過這樣做,我們將瀏覽ECTO的四個主要組件中的每個組件:存儲架,模式,更改和查詢。
創建一個新的應用程序

讓我們從生成新的混合應用程序開始:

-SUP標誌生成了一些OTP應用程序所需的其他樣板代碼。此應用程序需要具有監督樹,因為Ecto需要它(一分鐘內詳細介紹)。

設置依賴項

現在,讓我們使用一些應用程序依賴項更新Mix.exs文件。為此,我們將要指定ECTO及其適配器之一。我選擇為此使用MySQL,因此我們需要指定Mariaex庫(ECTO支持許多數據庫)。
mix new notex <span>--sup
</span>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
>

>在mix.exs文件中更新應用程序/0函數,並使用以下內容:>

和更新DEPS/0,以下內容:

>

現在,用混合deps.get獲取依賴項。

接下來,我們需要將這些依賴項集成到我們的應用程序中。這將涉及為ECTO存儲庫創建一個新的包裝器模塊,更新應用程序的監督樹以啟動和監督該新模塊,並配置適配器的連接信息。

讓我們首先從lib/notex/repo.ex上定義一個notex.repo模塊,並使用以下代碼:

mix new notex <span>--sup
</span>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

>常規的該模塊(lib/app_name/repo.ex)的位置。每當我們使用Mix ecto命令時,都會默認在AppName.Repo上查找定義的存儲庫。我們可以將其放置在其他地方,但這將是不便之處,即必須使用-r(或 - repo)標誌來指定其位置。

>

>上述notex.repo模塊使我們能夠使用eTeco使用數據庫。它通過首先從ECTO的repo模塊(提供數據庫查詢API)注入功能,然後通過將我們的OTP應用程序命名為:Notex。

> ecto存儲庫為我們提供了一個通用接口,可以與基礎

數據庫進行交互(這是由所使用的適配器決定的)。因此,儘管Ecto使用了術語回購,但它不遵循存儲庫設計模式,因為它是數據庫周圍的包裝器,而不是表格。 >。

>現在我們已經定義了notex.repo模塊,我們現在必須將其添加到Notex模塊中的監督樹(lib/notex.ex)。使用以下內容更新開始/2函數:

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
登入後複製
登入後複製
登入後複製
登入後複製
>我們添加了Notex.Repo模塊作為兒童主管(因為它本身就是一個監督OTP應用程序)。這意味著它將由我們的OTP應用程序監督,我們的應用程序將負責在應用程序啟動時啟動它。

使用ECTO創建的每個連接都使用單獨的過程(其中使用稱為Poolboy的庫從過程池中拉出該過程)。這樣做是為了使我們的查詢可以同時執行,並且可以從故障(例如超時)中獲得彈性。因此,我們的應用程序需要OTP,因為ECTO具有自己的過程需要監督的過程(包括監督樹監督數據庫連接池)。可以使用Erlang的Observer庫可以看出這一點,這使我們能夠可視化應用程序中的過程。將存儲庫添加到要監督的工作流程中後,我們需要最後配置適配器,以便它可以與數據庫進行通信。將以下代碼放在`config/config.exs`文件的末尾(根據需要更新詳細信息):
mix new notex <span>--sup
</span>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
在這裡,我們指定了我們的OTP應用程序的名稱(:notex)和我們剛定義的模塊(notex.repo)的名稱,以啟用與數據庫的通信。其他配置選項應該是相當自我解釋的。 ECTO 2要求我們另外指定我們在應用程序中使用的ECTO存儲庫列表。

> ecto實際上為我們提供了一個快捷方式,用於設置上述存儲庫模塊作為混合任務:mix ecto.gen.repo。這為我們生成了存儲庫模塊,並使用一些基本配置更新了config.exs文件(雖然仍需要手動添加回購模塊)。我避免在此處使用它,主要是出於教學原因是顯示如何手動設置ECTO(這是回購生成器假設您使用Postgres的事實,因此我們必須在配置中更新適配器)。

繼續前進,讓我們快速了解過程層次結構。 (請注意,如果您正在運行ECTO 2,則首先需要使用Mix ecto.創建數據庫。

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
登入後複製
登入後複製
登入後複製
登入後複製
>導航到“應用程序”選項卡,我們可以看到該應用程序的過程,包括哪些是主管:

ecto庫

>這就是為什麼此應用程序需要成為OTP應用程序的原因。但這在本文中,我們將在流程和OTP方面要走的兔子洞。他們將在以後的文章中更詳細地介紹。

>

創建數據庫和表

現在,使用該設置,我們可以創建我們的數據庫和表。要創建數據庫,請運行以下命令:>

為了創建表,我們將使用ECTO的遷移功能。遷移使我們能夠與源代碼一起版本版本,從而可以跟踪更改並應用不同的狀態。因此,只要我們想更改數據庫的結構。
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>
登入後複製
登入後複製
可以使用mix ecto.gen.gen.ger.gen.ger命令創建一個新的遷移。

>以上應在Priv/Repo/Migrations以及一個新的遷移文件中創建一個新的遷移文件夾。此文件以創建的日期和時間(用於簡單目錄訂購)以及我們的遷移名稱前綴。打開該文件並將其修改為以下內容:

mix new notex <span>--sup
</span>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

>保持簡單,我們使用創建宏來定義一個帶有兩個字段的新表(稱為註釋):note_name和note_content。主鍵是為我們創建的(命名ID)。儘管我們的兩個字段都被定義為簡單的字符串,但ECTO支持多種類型 - 您可以在其文檔中查看。 >

>我們的遷移完成後,我們現在可以使用以下命令運行遷移:>

<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
登入後複製
登入後複製
登入後複製
登入後複製
這將使用3個字段創建我們的筆記表(第三個字段是ID,主要鍵)。 >

>創建了表,現在該為表創建模型了。該模型用於定義表及其各自類型的字段。這些應用程序將在施放和驗證數據時通過應用程序和ECTO的查詢DSL使用。模型定義也可能包含虛擬字段(與遷移定義不同),這些字段通常用於持有我們不想持續存在的短暫數據(例如未經解決的密碼)。

>

>以其最基本的形式,我們的notex.note模型(位於lib/notex/note.ex)看起來如下:

>

>我們注入ecto.schema模塊,以便我們可以使用模式宏來定義字段及其類型。當我們使用ECTO的更改集時,這些定義將在稍後變得重要。模式宏對我們所做的其他事情是將類型的結構定義為當前模塊(在這種情況下,是%notex.note.note {})。該結構將使我們能夠創建新的更改(更快詳細介紹)並將數據插入表中。
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>
登入後複製
登入後複製
>僅在上面,我們就可以啟動IEX並開始查詢我們的數據庫:>

(刪除的控制台調試信息。)

> 導入

ecto的查詢模塊,以使我們在Shell中使用的所有查詢DSL宏(例如來自來自的)。然後,我們創建一個簡單的查詢以返回所有記錄(使用全/1),僅選擇Note_name字段。這將返回一個空列表,因為我們目前在數據庫中沒有記錄。讓我們創建一個新的更改集並將其插入表格:
defmodule Notex<span>.Repo do
</span>  use Ecto<span>.Repo, otp_app: :notex
</span><span>end
</span>
登入後複製

(刪除的控制台調試信息。)

>

我們從再次導入ecto.Query開始,這是最後一次獲取操作所需的(特別是從宏中出發)。然後,我們使用從ecto.changeset的更改/1函數使用%notex.note {} struct創建一個新更改。然後插入此更改,然後檢索。
<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>
登入後複製
> 使用記錄時,我們使用的更改是我們使用的。它們使我們能夠在插入之前跟踪對數據的更改,並驗證這些更改並將其值投入正確的數據類型(根據我們的模式定義)。從上面可以看到,``to.changeset {} struct都包含許多成員,這些成員對於查看更改是否有效(canschet.valid?)很有用,如果它們不存在,則有什麼錯誤.Errors),等等。

>讓我們更新notex.note模型以演示某些更改和查詢操作,因為在IEX中執行這些更改和查詢操作有點混亂:

>
mix new notex <span>--sup
</span>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

>讓我們瀏覽五個新功能中的每個功能。 insert_note/1函數為我們創建了一個新註釋。 CAST/4函數將數據從輸入字段鑄造到其各自的字段類型(根據我們的模式定義),並確保所有必需的字段都具有值。然後將從Cast/4返回的更改插入數據庫中。請注意,在ECTO 2中,應使用Cast/3和Validate_required/3功能代替cast/4。

get_notes/0功能返回表中所有註釋的元組列表。這是通過選擇語句中的模式匹配來完成的。 (例如,我們很容易返回一個地圖列表,例如:%{id:n.id,note_name:n.note_name}。)

get_note/1函數根據註釋ID從表中檢索單個註釋。這是通過Get完成的!功能,要么在成功時返回註釋,要么在失敗時投擲。

> 根據提供的註釋ID更新註釋。注意函數簽名映射(ID密鑰)中的字符串鍵。這是我從Phoenix框架中獲取的一項慣例,其中不動動的數據(通常是用戶供給)在帶有字符串鍵的地圖中表示,並且具有原子密鑰的地圖中,消毒的數據表示。要執行更新,我們首先根據數據庫從數據庫中檢索註釋,然後使用Cast/4函數將更改應用於記錄,然後最終將更新的更改集插入數據庫。 > delete_note/1函數從數據庫中刪除註釋。我們首先通過其ID從數據庫中獲取註釋(類似於Update_note/1函數),然後使用返回的Note struct刪除它。

>有上述CRUD操作,讓我們跳回IEX並嘗試一下:>

(刪除的控制台調試信息。)

>

>我們有了它,是使用ecto的基本CRUD應用程序!我們可以渲染輸出並使API更好地查詢,但是我將其作為擴展名,因為這些內容與我們所涵蓋的內容相切(而且本文已經足夠長,我認為)。

結論
<span>def <span>application</span> do
</span>  <span>[applications: [:logger, :ecto, :mariaex],
</span>   <span>mod: {Notex, []}]
</span><span>end
</span>
登入後複製
登入後複製
登入後複製
登入後複製

>本文通過從頭開始創建一個簡單的CRUD應用程序來研究ECTO的基本面。我們已經看到了許多能力ecto包來管理記錄和數據庫更改,包括遷移,模式及其查詢DSL,以及涉及切向主題(例如OTP)。我希望這是那些希望加速使用Elixir中的數據庫的人!在下一篇文章中,我介紹了Elixir的Ecto查詢DSL的基礎知識。

經常詢問有關Elixir的Ecto庫

的問題(常見問題解答)

>

> ecto如何處理數據驗證?

。更改是一個數據結構,可將數據庫進行更改,以及錯誤,驗證和類型鑄造信息。更改集可確保僅將有效數據保存到數據庫中,從而為數據驗證和錯誤處理提供了可靠的機制。

>

>我如何使用eTOTO執行複雜的查詢?這使您可以以可讀性和高效的方式編寫複雜的查詢。您可以使用“從關鍵字”啟動查詢,並鏈接其他功能,例如select,where,order_by,然後加入構建查詢。 ECTO還支持子征服,聚合和其他高級SQL功能。

> ecto.schema在Ecto庫中的作用是什麼?數據。它將您的Elixir應用程序的數據映射到數據庫表,反之亦然。使用ecto.schema,您可以定義數據的字段,它們的類型以及不同模式之間的任何關聯。

ecto如何處理數據庫遷移?

用於處理數據庫遷移。遷移是隨著時間的推移會改變數據庫結構的腳本。他們可以創建或刪除表,添加或刪除列,創建索引等等。 ECTO的遷移功能可確保以受控和可逆的方式執行這些更改。

可以使用NOSQL數據庫來工作?

,而ECTO主要是為SQL數據庫設計的,它也可以與NOSQL一起使用通過使用適配器的數據庫。但是,某些功能(例如遷移和復雜查詢)可能無法得到完全支持,或者可能會根據所使用的特定NOSQL數據庫和適配器的方式有所不同。

>

> ecto如何處理交易?和強大的API處理交易。您可以使用ecto.repo.transaction函數來啟動事務,如果函數返回,則交易中所做的任何更改都將歸結到數據庫:確定或返回(如果返回)回滾:error。

>什麼是ecto.multi? ​​ecto.multi是ECTO的功能,可讓您將多個操作分組在一起。當您需要在一次交易中執行多個操作時,這很有用,並且您希望所有這些都成功或整體失敗。 ecto.Multi確保數據一致性並使錯誤處理更加容易。

>如何將ECTO與Phoenix?

菲尼克斯(Phoenix)一起使用,這是流行的elixir的Web框架,與ECTO無縫集成。 Phoenix使用ECTO來滿足其所有數據操作需求,並提供使創建ECTO模式,更改集和遷移的生成器。您還可以在鳳凰控制器和視圖中直接使用eTo的查詢API。

我如何了解有關ecto的更多信息?

>官方的ecto文檔是一個很好的資源,可以了解更多有關eTecto的信息。它為ECTO的所有功能以及示例和最佳實踐提供了全面的指南。您還可以在線找到許多詳細介紹ECTO的各個方面的教程和博客文章。

以上是ecto庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板