目錄
和更新DEPS/0,以下內容:
經常詢問有關Elixir的Ecto庫
用於處理數據庫遷移。遷移是隨著時間的推移會改變數據庫結構的腳本。他們可以創建或刪除表,添加或刪除列,創建索引等等。 ECTO的遷移功能可確保以受控和可逆的方式執行這些更改。
>
>什麼是ecto.multi? ​​ecto.multi是ECTO的功能,可讓您將多個操作分組在一起。當您需要在一次交易中執行多個操作時,這很有用,並且您希望所有這些都成功或整體失敗。 ecto.Multi確保數據一致性並使錯誤處理更加容易。

>如何將ECTO與Phoenix?

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

ecto庫

Feb 18, 2025 am 09:38 AM

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1253
29
C# 教程
1228
24
CNCF ARM64飛行員:影響和見解 CNCF ARM64飛行員:影響和見解 Apr 15, 2025 am 08:27 AM

該試點程序是CNCF(雲本機計算基礎),安培計算,Equinix金屬和驅動的合作,簡化了CNCF GitHub項目的ARM64 CI/CD。 該計劃解決了安全問題和績效

使用AWS ECS和LAMBDA的無服務器圖像處理管道 使用AWS ECS和LAMBDA的無服務器圖像處理管道 Apr 18, 2025 am 08:28 AM

該教程通過使用AWS服務來指導您通過構建無服務器圖像處理管道。 我們將創建一個部署在ECS Fargate群集上的next.js前端,與API網關,Lambda函數,S3桶和DynamoDB進行交互。 Th

21個開發人員新聞通訊將在2025年訂閱 21個開發人員新聞通訊將在2025年訂閱 Apr 24, 2025 am 08:28 AM

與這些頂級開發人員新聞通訊有關最新技術趨勢的了解! 這個精選的清單為每個人提供了一些東西,從AI愛好者到經驗豐富的後端和前端開發人員。 選擇您的收藏夾並節省時間搜索REL

See all articles