>本文快速查看ECTO庫的主要方面。雖然它是為ECTO 1.X編寫的,但本文中的示例與ECTO 2兼容,並且在差異所在的位置,則提到了它們。假定長生不老藥和混合的基本知識。
鑰匙要點
現在,讓我們使用一些應用程序依賴項更新Mix.exs文件。為此,我們將要指定ECTO及其適配器之一。我選擇為此使用MySQL,因此我們需要指定Mariaex庫(ECTO支持許多數據庫)。
mix new notex <span>--sup </span>
>在mix.exs文件中更新應用程序/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>
使用ECTO創建的每個連接都使用單獨的過程(其中使用稱為Poolboy的庫從過程池中拉出該過程)。這樣做是為了使我們的查詢可以同時執行,並且可以從故障(例如超時)中獲得彈性。因此,我們的應用程序需要OTP,因為ECTO具有自己的過程需要監督的過程(包括監督樹監督數據庫連接池)。可以使用Erlang的Observer庫可以看出這一點,這使我們能夠可視化應用程序中的過程。將存儲庫添加到要監督的工作流程中後,我們需要最後配置適配器,以便它可以與數據庫進行通信。將以下代碼放在`config/config.exs`文件的末尾(根據需要更新詳細信息):
mix new notex <span>--sup </span>
> 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的遷移功能。遷移使我們能夠與源代碼一起版本版本,從而可以跟踪更改並應用不同的狀態。因此,只要我們想更改數據庫的結構。
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>
>以上應在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>
>創建了表,現在該為表創建模型了。該模型用於定義表及其各自類型的字段。這些應用程序將在施放和驗證數據時通過應用程序和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>
(刪除的控制台調試信息。)
> 導入
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>
>讓我們更新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完成的!功能,要么在成功時返回註釋,要么在失敗時投擲。
>>有上述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的基礎知識。
> ecto如何處理數據驗證?
>
>我如何使用eTOTO執行複雜的查詢?這使您可以以可讀性和高效的方式編寫複雜的查詢。您可以使用“從關鍵字”啟動查詢,並鏈接其他功能,例如select,where,order_by,然後加入構建查詢。 ECTO還支持子征服,聚合和其他高級SQL功能。 > ecto.schema在Ecto庫中的作用是什麼?數據。它將您的Elixir應用程序的數據映射到數據庫表,反之亦然。使用ecto.schema,您可以定義數據的字段,它們的類型以及不同模式之間的任何關聯。ecto如何處理數據庫遷移?
可以使用NOSQL數據庫來工作?
以上是ecto庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!