国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
鑰匙要點(diǎn)
>加入和關(guān)聯(lián)
>動態(tài)字段訪問
結(jié)論
經(jīng)常詢問有關(guān)長生素的ecto查詢dsl
??
>
連接。這允許它有效處理多個並發(fā)查詢,確保您的應(yīng)用程序即使在重負(fù)載下也保持響應(yīng)。
首頁 科技週邊 IT業(yè)界 elixir octo查詢DSL:超越基礎(chǔ)知識

elixir octo查詢DSL:超越基礎(chǔ)知識

Feb 18, 2025 am 10:53 AM

elixir octo查詢DSL:超越基礎(chǔ)知識

elixir octo查詢DSL:超越基礎(chǔ)知識

>本文基於我在理解Ecto查詢DSL:基礎(chǔ)知識的Ecto的基礎(chǔ)上的基礎(chǔ)?,F(xiàn)在,我將探索ECTO的更高級功能,包括查詢組成,加入和協(xié)會,SQL片段注入,顯式鑄造和動態(tài)場訪問。

>

再次,假定了長生不老藥的基本知識,以及ECTO的基礎(chǔ)知識,我在Ecto庫的簡介中介紹了這一點(diǎn)。

鑰匙要點(diǎn)

    ecto允許在長生不老藥中查詢構(gòu)圖,使開發(fā)人員能夠創(chuàng)建可重複使用的查詢,並將它們合併為烘乾機(jī)和更可維護(hù)的代碼??梢允褂藐P(guān)鍵字查詢語法或宏語法來實(shí)現(xiàn)這一點(diǎn)。
  • > ecto提供了處理模型中的表關(guān)係(聯(lián)接和關(guān)聯(lián))的能力。相關(guān),使用has_one/3,has_many/3和屬於/3宏來定義,允許開發(fā)人員處理模型中以外鍵實(shí)現(xiàn)的表格關(guān)係。
  • >
  • ecto支持SQL片段注入,該功能允許使用Fragment/1函數(shù)直接將SQL代碼直接注入查詢中。當(dāng)開發(fā)人員需要將其放回原始SQL中以進(jìn)行不受ECTO功能不涵蓋的操作時,這很有用。
  • > ECTO支持明確的鑄造和動態(tài)場訪問。顯式鑄造允許開發(fā)人員指定應(yīng)該施放表達(dá)式的類型,而動態(tài)字段訪問可以從給定表中搜索任何字段,從而使查詢更加通用和通用。
  • QUERY組成
>可以將ECTO中的單獨(dú)查詢組合在一起,從而可以創(chuàng)建可重複使用的查詢。 例如,讓我們看看如何創(chuàng)建三個單獨(dú)的查詢並將它們組合在一起以實(shí)現(xiàn)烘乾機(jī)和更多可重複使用的代碼:>

SQL版本的重複性很高,但另一方面的ECTO版本非常乾燥。第一個查詢(get_users_overview)只是檢索基本用戶信息的通用查詢。第二個查詢(search_by_username)通過根據(jù)我們正在搜索的某些用戶名過濾用戶名來構(gòu)建第一個查詢。第三個查詢(paginate_query)是在第二個構(gòu)建的,它限制了結(jié)果並將它們從特定偏移量中獲?。榉猪撎峁┗A(chǔ))。

>

>不難想像所有以上三個查詢都可以一起使用,以提供搜索特定用戶的搜索結(jié)果。每個都可以與其他查詢一起使用每個應(yīng)用程序需求,而無需不必要地重複整個代碼庫中查詢的部分。 >>>>。

>加入和關(guān)聯(lián)

>在查詢時加入非?;?,但我們只是現(xiàn)在介紹它們。之所以這樣做,是因?yàn)閮H學(xué)習(xí)加入ECTO並沒有用:我們也需要了解關(guān)聯(lián)。儘管這些並不難,但它們並不像到目前為止其他主題那麼小。 簡單地說,關(guān)聯(lián)使開發(fā)人員能夠在模型中處理表關(guān)係(以外鍵實(shí)現(xiàn))。它們在每個模型的模式中使用has_one/3和has_many/3宏(對於包含其他模型的模型)和ander_to/3宏(對於其他模型與其他模型 - 具有外鍵的模型)定義了它們。 。

查看我們的ectoing應(yīng)用程序,我們可以看到一個ectoing.user模型與ectoing.message模型之間的關(guān)聯(lián)的一個示例。 ectoing.user中定義的架構(gòu)定義以下關(guān)聯(lián):

我們可以看到一個用戶有許多消息(ectoing.message),我們正在調(diào)用此關(guān)聯(lián):消息。

在ectoing.message模型中,我們定義以下關(guān)聯(lián)關(guān)係:>
<span>SELECT id, username FROM users;
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%";
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0;
</span>

>在這裡,我們說的是模型,ectoing.message,屬於ectoing.user模型。我們還將協(xié)會命名為:用戶。默認(rèn)情況下,ECTO將把_ID附加到屬於關(guān)聯(lián)名稱上,並將其用作外鍵名(因此,在這裡是:user_id)??梢酝ㄟ^指定forefer_key選項手動指定外鍵名,可以覆蓋此默認(rèn)行為。例如:

>現(xiàn)在讓我們看一下一個簡單的查詢,該查詢使用JOIN來獲取用戶及其消息:
offset <span>= 0
</span>username <span>= <span>"%tp%"</span>
</span>
<span># Keywords query syntax
</span>get_users_overview <span>= from u in Ectoing.User,
</span>  <span>select: [u.id, u.username]
</span>
search_by_username <span>= from u in get_users_overview,
</span>  <span>where: like(u.username, ^username)
</span>
paginate_query <span>= from search_by_username,
</span>  <span>limit: 10,
</span>  <span>offset: ^offset
</span>
<span># Macro syntax
</span>get_users_overview <span>= (Ectoing.User
</span><span>|> select([u], [u.id, u.username]))
</span>
search_by_username <span>= (get_users_overview
</span><span>|> where([u], like(u.username, ^username)))
</span>
paginate_query <span>= (search_by_username
</span><span>|> limit(10)
</span><span>|> offset(^offset))
</span>
Ectoing<span>.Repo.all paginate_query
</span>
>

has_many <span>:messages, Ectoing.Message
</span>
返回的值:

belongs_to <span>:user, Ectoing.User
</span>
明顯,我們有許多卸載的關(guān)聯(lián),包括:消息協(xié)會。加載此關(guān)聯(lián)可以通過兩種方式之一:從查詢的結(jié)果集或查詢本身內(nèi)部進(jìn)行。可以使用repo.preload函數(shù)來完成從結(jié)果集中的加載關(guān)聯(lián):
<span># Ectoing.Message
</span>belongs_to <span>:user, Ectoing.User, foreign_key: some_other_fk_name
</span>

可以使用聯(lián)合和預(yù)加載函數(shù)的組合來完成查詢內(nèi)的

>加載關(guān)聯(lián):>
<span>SELECT * FROM users u INNER JOIN messages m ON u.id = m.user_id WHERE u.id = 4;
</span>

現(xiàn)在,我們在結(jié)果中加載了消息關(guān)聯(lián):
<span># Keywords query syntax
</span>query <span>= from u in Ectoing.User,
</span>  <span>join: m in Ectoing.Message, on: u.id == m.user_id,
</span>  <span>where: u.id == 4
</span>
<span># Macro syntax
</span>query <span>= (Ectoing.User
</span><span>|> join(:inner, [u], m in Ectoing.Message, u.id == m.user_id)
</span><span>|> where([u], u.id == 4))
</span>
Ectoing<span>.Repo.all query
</span>

>關(guān)聯(lián)隱式地加入了我們的主密鑰和外鍵列,因此我們不必指定一個:on子句。從上面,我們還可以看到,在預(yù)加載協(xié)會方面,它們並不是懶惰的。如果需要,必須明確加載關(guān)聯(lián)。

>
<span>[%Ectoing.User{__meta__: #Ecto.Schema.Metadata<:loaded>,
</span>  <span>firstname: <span>"Jane"</span>,
</span>  <span>friends_of: #Ecto.Association.NotLoaded<association :friends_of is not loaded>,
</span>  <span>friends_with: #Ecto.Association.NotLoaded<association :friends_with is not loaded>,
</span>  <span>id: 4,
</span>  <span>inserted_at: #Ecto.DateTime<2016-05-15T20:23:58Z>,
</span>  <span>messages: #Ecto.Association.NotLoaded<association :messages is not loaded>,
</span>  <span>surname: <span>"Doe"</span>,
</span>  <span>updated_at: #Ecto.DateTime<2016-05-15T20:23:58Z>,
</span>  <span>username: <span>"jane_doe"</span>},
</span> <span>%Ectoing.User{__meta__: #Ecto.Schema.Metadata<:loaded>,
</span>  <span>firstname: <span>"Jane"</span>,
</span>  <span>friends_of: #Ecto.Association.NotLoaded<association :friends_of is not loaded>,
</span>  <span>friends_with: #Ecto.Association.NotLoaded<association :friends_with is not loaded>,
</span>  <span>id: 4,
</span>  <span>inserted_at: #Ecto.DateTime<2016-05-15T20:23:58Z>,
</span>  <span>messages: #Ecto.Association.NotLoaded<association :messages is not loaded>,
</span>  <span>surname: <span>"Doe"</span>,
</span>  <span>updated_at: #Ecto.DateTime<2016-05-15T20:23:58Z>,
</span>  <span>username: <span>"jane_doe"</span>}]
</span>
由於本文專門針對ECTO的查詢DSL,因此我們不會在此處介紹關(guān)聯(lián)的插入,更新或刪除。有關(guān)此信息的更多信息,請查看與ECTO協(xié)會和嵌入的博客文章。SQL片段注入

> ecto為我們提供了很多功能,但它僅為SQL中的常見操作提供功能(它並不是要模仿整個SQL語言)。當(dāng)我們需要放回原始SQL中時,我們可以使用片段/1函數(shù),使SQL代碼直接注入查詢中。

例如,讓我們在用戶名字段上執(zhí)行對案例敏感的搜索:>

(以上包含MySQL特定的SQL。如果您使用的是另一個數(shù)據(jù)庫,則對您不起作用。)
<span>SELECT id, username FROM users;
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%";
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0;
</span>
>
offset <span>= 0
</span>username <span>= <span>"%tp%"</span>
</span>
<span># Keywords query syntax
</span>get_users_overview <span>= from u in Ectoing.User,
</span>  <span>select: [u.id, u.username]
</span>
search_by_username <span>= from u in get_users_overview,
</span>  <span>where: like(u.username, ^username)
</span>
paginate_query <span>= from search_by_username,
</span>  <span>limit: 10,
</span>  <span>offset: ^offset
</span>
<span># Macro syntax
</span>get_users_overview <span>= (Ectoing.User
</span><span>|> select([u], [u.id, u.username]))
</span>
search_by_username <span>= (get_users_overview
</span><span>|> where([u], like(u.username, ^username)))
</span>
paginate_query <span>= (search_by_username
</span><span>|> limit(10)
</span><span>|> offset(^offset))
</span>
Ectoing<span>.Repo.all paginate_query
</span>
fragment/1函數(shù)將SQL代碼作為字符串,我們想將其註入第一個參數(shù)。它使列和值可以綁定到SQL代碼片段。這是通過字符串中的佔(zhàn)位符(作為問號)完成的,隨後的論點(diǎn)分別傳給了片段。

>顯式鑄造

ecto使用模型的架構(gòu)定義的另一種方式是,將查詢中的插值表達(dá)式自動施放到架構(gòu)中定義的相應(yīng)字段類型中。這些插值表達(dá)式被施放在與之比較的場的類型上。例如,如果我們有一個查詢片段,例如u.username> ^用戶名,其中u.username定義為字段:用戶名,架構(gòu)中的字符串,則用戶名變量將被ecto自動施加到字符串。 > 但是,有時,我們並不總是希望eTo將插值表達(dá)式施加給定義的字段類型。在其他時候,ECTO將無法推斷出表達(dá)式的類型(通常是涉及SQL代碼的片段時)。在這兩種情況下,我們都可以使用類型/2函數(shù)來指定表達(dá)式及其應(yīng)施放的類型。

>讓我們以第一個想要將表達(dá)式施放到另一種類型的情況下,因?yàn)檫@是更有趣的場景。在我們的ectoing應(yīng)用程序中,我們使用了ecto.schema.timestamps宏來向我們的每個表添加兩個額外的字段:updated_at and inserted_at。默認(rèn)情況下,宏將這些字段的類型設(shè)置為具有ECTO.DATETIME的類型。現(xiàn)在,如果我們想查看本月註冊了多少用戶,我們可以使用以下簡單查詢:

>

但是,這將為我們提供一個ecto.casterror,因?yàn)闊o法將ecto.date struct施加到ecto.dateTime struct(因?yàn)槲覀冋诒容^interpolated ecto.ddate表達(dá)式與ecto.dateTime類型的字段)。在這種情況下,我們可以構(gòu)建一個ecto.datetime struct,或者我們可以指定要將表達(dá)式施加到ecto.date而不是ecto.datetime:>

現(xiàn)在,Ecto愉快地接受了查詢。在鑄造操作後,然後將插值的ecto.date表達(dá)式轉(zhuǎn)換為基礎(chǔ):日期類型,然後讓基礎(chǔ)數(shù)據(jù)庫(在這種情況下為MySQL)處理日期和dateTime之間的比較。

>動態(tài)字段訪問

>讓我們從一起編寫查詢的示例,我們在其中執(zhí)行了用戶名搜索:

<span>SELECT id, username FROM users;
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%";
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0;
</span>

喜歡之後的分頁查詢,我們也可以概括此查詢,以便它可以從給定表中搜索任何字段。這可以通過執(zhí)行動態(tài)字段訪問來完成:

offset <span>= 0
</span>username <span>= <span>"%tp%"</span>
</span>
<span># Keywords query syntax
</span>get_users_overview <span>= from u in Ectoing.User,
</span>  <span>select: [u.id, u.username]
</span>
search_by_username <span>= from u in get_users_overview,
</span>  <span>where: like(u.username, ^username)
</span>
paginate_query <span>= from search_by_username,
</span>  <span>limit: 10,
</span>  <span>offset: ^offset
</span>
<span># Macro syntax
</span>get_users_overview <span>= (Ectoing.User
</span><span>|> select([u], [u.id, u.username]))
</span>
search_by_username <span>= (get_users_overview
</span><span>|> where([u], like(u.username, ^username)))
</span>
paginate_query <span>= (search_by_username
</span><span>|> limit(10)
</span><span>|> offset(^offset))
</span>
Ectoing<span>.Repo.all paginate_query
</span>

>當(dāng)需要動態(tài)指定字段時,使用字段/2函數(shù)。它的第一個參數(shù)是要訪問的字段表,第二個參數(shù)是該字段的名稱本身,被指定為原子。使用以上的常規(guī)查詢,我們可以將其封裝在函數(shù)中,並使用參數(shù)從給定查詢中指定的表中搜索任何給定字段。

結(jié)論

在這本書和我的上一篇有關(guān)ECTO查詢DSL的文章中,我們涵蓋了很多它的功能。提到的功能應(yīng)涵蓋應(yīng)用程序中使用ECTO時遇到的絕大多數(shù)案例。但是仍然有一些尚未涵蓋的主題(例如查詢前綴)。 ECTO備受期待的2.0版本中還有所有即將推出的新功能,包括子查詢,聚合查詢和多一對一的關(guān)聯(lián)。這些以及其他不具體特定的ECTO查詢DSL的功能將在以後的文章中介紹 - 請繼續(xù)關(guān)注!

>

經(jīng)常詢問有關(guān)長生素的ecto查詢dsl

的問題(常見問題解答)

> elixir的ecto查詢DSL是什麼,為什麼重要?它提供了一種在靠近SQL的語法中編寫查詢的方法,但具有編譯時安全性的額外好處,與Elixir代碼更好地集成以及抽象和代碼重複使用的潛力。這很重要,因?yàn)樗试S開發(fā)人員以更可讀和可維護(hù)的方式編寫複雜的查詢,從而降低了錯誤的可能性,並使代碼更易於理解和修改。

> ecto如何處理表之間的關(guān)聯(lián)? ecto提供了一種使用has_many,has_one和alters_to宏來定義表之間關(guān)聯(lián)的方法。這些關(guān)聯(lián)使您可以以方便有效的方式查詢相關(guān)數(shù)據(jù)。例如,如果您有一個用戶架構(gòu)並且每個用戶都有許多帖子,則可以使用簡單查詢的用戶檢索所有帖子。

我可以使用eTeco執(zhí)行涉及加入,子查詢和聚合的複雜查詢是的,是的,ecto支持廣泛的查詢操作,包括加入,子查詢和聚合。您可以使用JOIN關(guān)鍵字加入表,從關(guān)鍵字創(chuàng)建子征服,以及諸如SUM,AVG,MIN和MAX之類的功能來執(zhí)行聚合。這使ECTO成為以復(fù)雜方式查詢數(shù)據(jù)的強(qiáng)大工具。

> ecto如何處理交易?

ecto提供repo.Transaction函數(shù),使您可以在單個事務(wù)中執(zhí)行多個操作。如果任何操作失敗,則交易中所做的所有更改都會回滾。這樣可以確保數(shù)據(jù)的一致性和完整性。

>我可以將ECTO與postgresql?

??

以外的數(shù)據(jù)庫一起使用,而ECTO最初是設(shè)計用於與PostgreSQL合作的,現(xiàn)在它也支持其他數(shù)據(jù)庫,包括MySQL和MySQL和MySQL和MySQL和sqlite。您可以在設(shè)置ECTO存儲庫時指定數(shù)據(jù)庫類型。

>

> ecto如何處理遷移?

ecto提供了一個可靠的遷移系統(tǒng),允許您創(chuàng)建,修改和刪除數(shù)據(jù)庫表中的數(shù)據(jù)庫表一種受控和可逆的方式。您可以使用混合任務(wù)生成遷移文件,然後使用ECTO的DSL來定義遷移文件中的更改。

>我可以在插入或在數(shù)據(jù)庫中插入或更新數(shù)據(jù)之前使用ECTO驗(yàn)證數(shù)據(jù)嗎?是的,ECTO提供了一個更改功能,該功能允許您在數(shù)據(jù)庫中插入或更新數(shù)據(jù)之前驗(yàn)證數(shù)據(jù)。您可以在架構(gòu)中定義驗(yàn)證規(guī)則,然後使用更改功能將這些規(guī)則應(yīng)用於數(shù)據(jù)。

>

> eTOTO如何處理數(shù)據(jù)庫連接?

連接。這允許它有效處理多個並發(fā)查詢,確保您的應(yīng)用程序即使在重負(fù)載下也保持響應(yīng)。

>

>我可以使用ECTO執(zhí)行RAW SQL查詢嗎?高級,抽象的編寫查詢方式,您也可以使用ecto.adapters.sql.query函數(shù)在需要時執(zhí)行RAW SQL查詢。

> ecto如何處理schemaless詢??問? ECTO提供了一個ecto.query.api.Dynamic函數(shù),可讓您動態(tài)構(gòu)建查詢,而無需預(yù)定義的架構(gòu)。當(dāng)您需要根據(jù)用戶輸入或其他運(yùn)行時數(shù)據(jù)構(gòu)建查詢時,這可能很有用。

以上是elixir octo查詢DSL:超越基礎(chǔ)知識的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

開發(fā)人員的快捷方式到您的Udemy樣平臺 開發(fā)人員的快捷方式到您的Udemy樣平臺 Jun 17, 2025 pm 04:43 PM

在開發(fā)類似於Udemy的學(xué)習(xí)平臺時,重點(diǎn)不僅僅是內(nèi)容質(zhì)量。同樣重要的是如何交付內(nèi)容。這是因?yàn)楝F(xiàn)代教育平臺依賴於媒體,快速且易於消化。

用於購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺 用於購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺 Jun 25, 2025 am 08:28 AM

在一個在線信任不可談判的世界中,SSL證書對於每個網(wǎng)站都至關(guān)重要。 SSL認(rèn)證的市場規(guī)模在2024年價值56億美元,並且由於電子商務(wù)業(yè)務(wù)的激增而推動了強(qiáng)勁的增長

SaaS的5個最佳支付門戶:您的最終指南 SaaS的5個最佳支付門戶:您的最終指南 Jun 29, 2025 am 08:28 AM

付款網(wǎng)關(guān)是付款過程的關(guān)鍵組成部分,使企業(yè)能夠在線接受付款。它充當(dāng)客戶與商人之間的橋樑,安全地傳輸付款信息並促進(jìn)交易。 為了

由於新的Microsoft AI型號 由於新的Microsoft AI型號 Jul 05, 2025 am 12:44 AM

一種新的人工智能(AI)模型已經(jīng)證明了比幾個使用最廣泛使用的全球預(yù)測系統(tǒng)更快,更精確地預(yù)測重大天氣事件的能力。該名為Aurora的模型已接受過培訓(xùn)。

新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 Jul 03, 2025 pm 05:48 PM

在我們認(rèn)為人類始終超越機(jī)器的領(lǐng)域的另一個挫折中,研究人員現(xiàn)在建議AI比我們更好地理解情感。研究人員發(fā)現(xiàn)人工智能證明了一個

您的設(shè)備餵養(yǎng)AI助手並收集個人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 您的設(shè)備餵養(yǎng)AI助手並收集個人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 Jul 05, 2025 am 01:12 AM

不管喜歡與否,人工智能已成為日常生活的一部分。許多設(shè)備(包括電動剃須刀和牙刷)已成為AI驅(qū)動的“使用機(jī)器學(xué)習(xí)算法來跟蹤一個人的使用方式,Devi的方式

高級AI型號的CO&#8322;回答相同問題時的排放量比更常見的LLM 高級AI型號的CO&#8322;回答相同問題時的排放量比更常見的LLM Jul 06, 2025 am 12:37 AM

根據(jù)最近的一項研究,我們試圖使AI模型的功能越精確,其碳排放量就越大 - 某些提示產(chǎn)生的二氧化碳比其他提示高達(dá)50倍。

See all articles