一文看懂流行的Rust ORM
譯文譯者 | 布加迪
審校 | 重樓
對(duì)象關(guān)系映射(ORM)是一種通過(guò)抽象數(shù)據(jù)庫(kù)交互的底層細(xì)節(jié)來(lái)簡(jiǎn)化應(yīng)用程序中數(shù)據(jù)訪(fǎng)問(wèn)和操作的技術(shù)。ORM使您能夠使用首選編程語(yǔ)言來(lái)處理對(duì)象和類(lèi)型,同時(shí)與關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)無(wú)縫集成。
如果您不精通SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言)或數(shù)據(jù)庫(kù)管理,ORM的框架設(shè)計(jì)對(duì)用戶(hù)友好。ORM提供了一個(gè)高級(jí)抽象層,讓您可以使用熟悉的面向?qū)ο缶幊谈拍钆c數(shù)據(jù)庫(kù)進(jìn)行交互,從而大大簡(jiǎn)化了應(yīng)用程序數(shù)據(jù)庫(kù)集成。
Rust、SQL數(shù)據(jù)庫(kù)和ORM
在Rust中構(gòu)建應(yīng)用程序時(shí),可能需要某種形式的持久性。您可以從Rust生態(tài)系統(tǒng)中的許多數(shù)據(jù)庫(kù)范式和庫(kù)中進(jìn)行選擇。
假設(shè)您希望使用關(guān)系數(shù)據(jù)庫(kù),您可以選擇使用SQL客戶(hù)端通過(guò)程序中的原始SQL查詢(xún)?cè)跀?shù)據(jù)庫(kù)管理系統(tǒng)上運(yùn)行SQL操作,或者使用ORM允許您使用的Rust內(nèi)置類(lèi)型來(lái)處理數(shù)據(jù)庫(kù)。
Rust應(yīng)用程序中使用ORM有幾個(gè)好處。ORM讓用戶(hù)不需要手動(dòng)編寫(xiě)復(fù)雜的、容易出錯(cuò)的查詢(xún)。相反,您可以利用ORM框架的強(qiáng)大功能,通過(guò)簡(jiǎn)單直觀的API進(jìn)行日常數(shù)據(jù)庫(kù)操作,比如插入、更新和查詢(xún)數(shù)據(jù)。使用ORM,您可以編寫(xiě)在多個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)上工作的Rust程序,不必重寫(xiě)數(shù)據(jù)庫(kù)管理系統(tǒng)特有的SQL查詢(xún)。
與其他語(yǔ)言不同,Rust沒(méi)有廣泛采用的ORM。然而,Rust生態(tài)系統(tǒng)中有許多ORM用于各種目的,并支持多種數(shù)據(jù)庫(kù),包括Diesel、SQLx、Sled和SeaORM等。
Diesel ORM
Diesel是一個(gè)Rust ORM,提供了全面的特性,使開(kāi)發(fā)人員能夠高效地使用多個(gè)受支持的SQL數(shù)據(jù)庫(kù)。
Diesel提供了強(qiáng)類(lèi)型和編譯時(shí)間安全特性、富有表現(xiàn)力的查詢(xún)API、自動(dòng)模式遷移、事務(wù)和錯(cuò)誤處理等特性。
由于其性能、效率、安全性和可靠性,以及社區(qū)積極地對(duì)項(xiàng)目做貢獻(xiàn),Diesel是首選的ORM。此外,Diesel兼容Rocket等其他Rust Web框架。
Diesel為數(shù)據(jù)庫(kù)操作提供了crate(庫(kù))和CLI工具。
您可以運(yùn)行該命令為首選數(shù)據(jù)庫(kù)安裝diesel_cli工具(在本例中是sqlite數(shù)據(jù)庫(kù),將參數(shù)更改為首選的支持diesel的SQL數(shù)據(jù)庫(kù)的名稱(chēng))。
cargo install diesel_cli --no-default-features --features sqlite
此外,您可以將Diesel添加到項(xiàng)目的依賴(lài)項(xiàng)部分,以便在項(xiàng)目中使用該crate。
[dependencies]
diesel = { version = "1.4.5", features = ["sqlite"] }
下面介紹如何在Rust文件中為項(xiàng)目的數(shù)據(jù)庫(kù)操作導(dǎo)入Diesel。
use diesel::prelude::*;
這把diesel::prelude模塊中的所有類(lèi)型和特性導(dǎo)入當(dāng)前作用域。這樣一來(lái)就很容易使用Diesel的特性,不需要顯式導(dǎo)入每個(gè)類(lèi)型或特性。
總的來(lái)說(shuō),Diesel是一個(gè)非常適合您數(shù)據(jù)庫(kù)項(xiàng)目的ORM和數(shù)據(jù)庫(kù)工具,因?yàn)樗幸粋€(gè)充滿(mǎn)活力的社區(qū)、大量在線(xiàn)教程以及對(duì)庫(kù)的大力支持。
SeaORM ORM
SeaORM是面向Rust的關(guān)系型ORM,可以幫助構(gòu)建Web服務(wù)。SeaORM擁有大量的特性和功能,旨在簡(jiǎn)化處理數(shù)據(jù)庫(kù)的過(guò)程,包括強(qiáng)大的查詢(xún)構(gòu)建、模式定義和遷移、關(guān)系映射、事務(wù)和連接池,并借助Rust的async/await語(yǔ)法支持異步操作。
值得注意的是,SeaORM的API旨在符合人體工程學(xué)、富有表現(xiàn)力,允許您編寫(xiě)清晰簡(jiǎn)潔的數(shù)據(jù)庫(kù)查詢(xún)和操作。SeaORM直觀的語(yǔ)法和深思熟慮的抽象盡量減少了樣板代碼,并提高了生產(chǎn)力。
SeaORM為數(shù)據(jù)庫(kù)操作提供了CLI工具和crate。
下面是安裝sea- form –cli CLI工具的命令:
cargo install sea-orm-cli
您可以使用migrate init命令來(lái)編寫(xiě)一個(gè)遷移文件,以設(shè)置數(shù)據(jù)庫(kù)和模式。
sea- form -cli migrate init
將sea-orm crate添加到項(xiàng)目Cargo.toml文件的依賴(lài)項(xiàng)部分,以安裝和使用SeaORM。
[dependencies]
sea-orm = { version = "0.9" }
在安裝了SeaORM之后,您可以用use語(yǔ)句將庫(kù)導(dǎo)入到Rust文件中,如下所示:
use sea_orm::entity::prelude::*;
use sea_orm::entity::prelude::*;語(yǔ)句將sea_orm::entity::prelude模塊中的所有類(lèi)型和特性導(dǎo)入到當(dāng)前作用域,以允許您使用這些類(lèi)型和特性,而不必使用sea_orm::entity::prelude前綴來(lái)限定它們的名稱(chēng)。
SeaORM是一個(gè)出色的ORM,擁有充滿(mǎn)活力的社區(qū),還有出色的描述性文檔來(lái)幫助您入門(mén)。
SeaORM vs Diesel
為Rust項(xiàng)目選擇合適的ORM需要仔細(xì)考慮各種因素。
SeaORM和Diesel都提供了出色的性能,充分利用Rust的優(yōu)勢(shì)來(lái)優(yōu)化數(shù)據(jù)庫(kù)交互。SeaORM側(cè)重于簡(jiǎn)單性和直觀的API設(shè)計(jì),而Diesel注重編譯時(shí)檢查和安全性。
下面的表格比較了兩種ORM的特性和功能:
在Diesel和SeaORM之間進(jìn)行選擇取決于您的項(xiàng)目規(guī)格。Diesel已建立了社區(qū)支持,并因其強(qiáng)大的特性和性能而受到青睞。如果您注重編譯時(shí)檢查、安全性和簡(jiǎn)單性,那么Diesel很合適。
另一方面,SeaORM是新穎的,在不斷擴(kuò)展,它支持更多的SQL數(shù)據(jù)庫(kù)引擎和懶加載。如果您注重直觀的API設(shè)計(jì)和生產(chǎn)力,SeaORM可能更合適。
這兩種ORM都支持查詢(xún)、模式遷移和編譯時(shí)檢查。在做出決定之前,請(qǐng)考慮您在使用的數(shù)據(jù)庫(kù)管理系統(tǒng)和項(xiàng)目的大小。
Diesel讓處理數(shù)據(jù)庫(kù)輕而易舉
Rust的開(kāi)源社區(qū)繼續(xù)在增強(qiáng)現(xiàn)有及新興軟件包和ORM的成熟度和功能方面取得重大進(jìn)展。
據(jù)稱(chēng),Diesel是Rust生態(tài)系統(tǒng)中最流行的ORM之一。Diesel的廣泛采用證明了其強(qiáng)大的功能、高效的性能和積極的社區(qū)支持。Diesel開(kāi)發(fā)團(tuán)隊(duì)致力于完善和擴(kuò)展其功能,以確保它仍然是Rust開(kāi)發(fā)人員眼里一款可靠、穩(wěn)健的ORM解決方案。
原文標(biāo)題:An Overview of Popular Rust ORMs,作者:Ukeje Chukwuemeriwo Goodness