日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

宣布 Toasty:Rust 的異步 ORM

宣布 Toasty:Rust 的異步 ORM


Toasty 是一個為 Rust 編程語言設(shè)計的異步 ORM , 旨在簡化使用過程 。 Toasty 支持 SQL 和 NoSQL 數(shù)據(jù)庫 , 包括 DynamoDB 和 Cassandra(即將支持) 。

Toasty 目前處于開發(fā)初期階段 , 可以被視為“預(yù)覽版”(尚未準備好用于實際生產(chǎn)環(huán)境) 。 它還未在 crates.io 上發(fā)布 。 我之所以現(xiàn)在宣布它 , 是因為我已經(jīng)將 GitHub 倉庫公開 , 并計劃在公開環(huán)境中繼續(xù)開發(fā) , 希望能夠獲得反饋意見 。
使用 Toasty 的項目首先需要創(chuàng)建一個 schema 文件 , 以定義應(yīng)用程序的數(shù)據(jù)模型 。 例如 , 下面是 hello-toasty/schema.toasty 文件的內(nèi)容:
rustCopy codemodel User {
   #[key

   #[auto

   id: Id

   name: String

   #[unique

   email: String

   todos: [Todo


   moto: Option<String>model Todo {
   #[key

   #[auto

   id: Id

   #[index

   user_id: Id<User>

   #[relation(key = user_id references = id)

   user: User

   title: String

使用 Toasty 的 CLI 工具 , 您可以生成處理該數(shù)據(jù)模型所需的所有 Rust 代碼 。 上面 schema 文件生成的代碼可以在 這里 查看 。
之后 , 您可以輕松地操作數(shù)據(jù)模型:
rustCopy code// 創(chuàng)建一個新用戶 , 并為他們添加一些待辦事項 。 User::create()
   .name(\"John Doe\")
   .email(\"john@example.com\")
   .todo(Todo::create().title(\"Make pizza\"))
   .todo(Todo::create().title(\"Finish Toasty\"))
   .todo(Todo::create().title(\"Sleep\"))
   .exec(&db)
   .await?;// 從數(shù)據(jù)庫中加載用戶let user = User::find_by_email(\"john@example.com\").get(&db).await?// 加載并遍歷用戶的待辦事項let mut todos = user.todos().all(&db).await.unwrap();while let Some(todo) = todos.next().await {
   let todo = todo.unwrap();
   println!(\"{:#?\" todo);

為什么需要 ORM?從歷史上看 , Rust 一直被定位為系統(tǒng)級編程語言 。 在服務(wù)器端 , Rust 在數(shù)據(jù)庫、代理和其他基礎(chǔ)設(shè)施級應(yīng)用程序等場景中發(fā)展得最快 。 然而 , 與一些已經(jīng)在基礎(chǔ)設(shè)施級應(yīng)用中采用 Rust 的團隊交談時 , 不難發(fā)現(xiàn)他們開始更多地將 Rust 用于更高層次的應(yīng)用場景 , 比如傳統(tǒng)的 Web 應(yīng)用 。
一般的共識是 , 當性能不是最關(guān)鍵的考量時 , 應(yīng)盡可能提高生產(chǎn)效率 。 我同意這一觀點 。 在構(gòu)建 Web 應(yīng)用時 , 性能是次要的 , 生產(chǎn)效率才是關(guān)鍵 。 那么 , 為什么在性能要求較低的場景下 , 團隊卻越來越多地選擇使用 Rust 呢?這是因為一旦掌握了 Rust , 你就會變得非常高效 。
生產(chǎn)效率是一個復(fù)雜且多維度的問題 。 盡管我們都知道 Rust 的編輯-編譯-測試循環(huán)可能會有些慢 , 但這種摩擦感被更少的錯誤、生產(chǎn)問題以及長期維護上的穩(wěn)健性所抵消(Rust 的借用檢查器鼓勵更具可維護性的代碼) 。 此外 , 由于 Rust 能很好地適應(yīng)多種場景 , 無論是基礎(chǔ)設(shè)施級服務(wù)器應(yīng)用 , 更高層次的 Web 應(yīng)用 , 甚至是客戶端應(yīng)用(通過 WASM 運行在瀏覽器端 , 以及原生運行在 iOS、MacOS、Windows 等平臺上) , Rust 具有出色的代碼復(fù)用能力 。 內(nèi)部庫可以一次編寫 , 便能在所有這些上下文中復(fù)用 。
因此 , 盡管 Rust 可能不是原型開發(fā)的最優(yōu)選擇 , 但對于長期項目 , 它的競爭力非常強 。
那么 , 為什么需要一個 ORM?功能齊全的庫生態(tài)對于特定用例的生產(chǎn)效率至關(guān)重要 。 Rust 有一個充滿活力的生態(tài)系統(tǒng) , 但歷史上更側(cè)重于基礎(chǔ)設(shè)施級應(yīng)用 。 針對更高層次 Web 應(yīng)用的庫相對較少(盡管近年來這種情況有所改變) 。 此外 , 現(xiàn)有的許多庫通常為了性能而犧牲了易用性 。 在 Rust 的生態(tài)系統(tǒng)中存在一個空白點:許多團隊反映 , 當前 Rust 的 ORM 庫在使用上的摩擦感很大(有的團隊甚至選擇實現(xiàn)自己的數(shù)據(jù)庫抽象庫來應(yīng)對這種摩擦) 。 Toasty 旨在填補這一空白 , 專注于更高層次的應(yīng)用場景 , 并優(yōu)先考慮易用性 , 而不是性能最大化 。
什么樣的 ORM 才算易用?當然 , 這就是所謂的“百萬美元問題” 。 Rust 社區(qū)仍在探索如何設(shè)計易用的庫 。 Rust 的 traits 和生命周期特性非常強大 , 既能提高性能 , 也能實現(xiàn)有趣的模式(例如 typestate 模式) 。 然而 , 過度使用這些特性也會導致難以使用的庫 。
因此 , 在構(gòu)建 Toasty 時 , 我盡量謹慎地使用這些特性 , 注重最小化 traits 和生命周期的使用 。 下面這段代碼是從 Toasty 生成的代碼中摘取的 , 我預(yù)計這是 95% 的 Toasty 用戶可能會遇到的最復(fù)雜的類型簽名 。
rustCopy codepub fn find_by_email<'a>(
\temail: impl stmt::IntoExpr<'a String>) -> FindByEmail<'a> {

\tlet expr = User::EMAIL.eq(email);
\tlet query = Query::from_expr(expr);
\tFindByEmail { query

其中確實包含了一個生命周期 , 以避免在查詢構(gòu)建器中復(fù)制數(shù)據(jù) 。 根據(jù)用戶反饋 , 我可能會完全去掉生命周期 。
易用性的另一個方面是減少樣板代碼 。 Rust 已經(jīng)在這方面有一個非常出色的功能:過程宏 。 大多數(shù)人可能已經(jīng)使用過 Serde , 因此應(yīng)該了解它的優(yōu)勢 。 然而 , 對于 Toasty , 我選擇暫時不使用過程宏 , 至少在初期不使用 。
過程宏會在構(gòu)建時生成大量隱藏代碼 。 對于像 Serde 這樣的庫 , 這并不是問題 , 因為 Serde 宏生成的是公共 trait(Serialize 和 Deserialize)的實現(xiàn) 。 Serde 用戶實際上不需要了解這些 trait 的實現(xiàn)細節(jié) 。
而 Toasty 的情況有所不同 。 Toasty 會生成大量您將直接使用的公共方法和類型 。 在 “Hello Toasty” 示例中 , Toasty 生成了 User::find_by_email 方法 。 與過程宏不同 , 我選擇了顯式代碼生成步驟 , Toasty 會將代碼生成到文件中 , 您可以打開并閱讀 。 Toasty 會盡量使生成的代碼保持可讀性 , 以便更容易發(fā)現(xiàn)生成的方法 。 這種可發(fā)現(xiàn)性將使庫更加易用 。
Toasty 目前仍處于開發(fā)早期階段 , API 將根據(jù)您的反饋不斷演變 。 最終 , 如果您在使用過程中遇到摩擦 , 請告訴我 , 我會努力改進 。
支持 SQL 和 NoSQLToasty 支持 SQL 和 NoSQL 數(shù)據(jù)庫 。 截至目前 , 這意味著支持 Sqlite 和 DynamoDB , 盡管增加對其他 SQL 數(shù)據(jù)庫的支持應(yīng)該相對容易 。 我也計劃很快添加對 Cassandra 的支持 , 但也希望其他人能為不同數(shù)據(jù)庫的實現(xiàn)做出貢獻 。
需要明確的是 , Toasty 雖然同時支持 SQL 和 NoSQL 數(shù)據(jù)庫 , 但并不會抽象掉目標數(shù)據(jù)庫 。 一個使用 SQL 數(shù)據(jù)庫編寫的應(yīng)用程序無法直接運行在 NoSQL 數(shù)據(jù)庫上 。 相反 , Toasty 也不會抽象掉 NoSQL 數(shù)據(jù)庫 , 您需要理解如何建模 schema 才能充分利用目標數(shù)據(jù)庫 。 我的觀察是 , 大多數(shù)數(shù)據(jù)庫庫在處理不同的后臺數(shù)據(jù)存儲時 , 其核心功能基本一致:數(shù)據(jù)到結(jié)構(gòu)體的映射以及執(zhí)行基本的 Get、Insert 和 Update 查詢 。
Toasty 從這一標準功能集入手 , 并在可選的基礎(chǔ)上暴露數(shù)據(jù)庫特定的功能 。 它還將通過對生成的查詢方法進行選擇 , 幫助您避免在目標數(shù)據(jù)庫上執(zhí)行低效查詢 。
下一步您應(yīng)該嘗試使用 Toasty , 運行示例并進行實驗 。 目前 , Toasty 仍在積極開發(fā)中 , 尚未準備好投入實際使用 。 下一步的目標是填補現(xiàn)有的功能空白 。 我計劃在明年年底之前(更現(xiàn)實的時間點)讓 Toasty 準備好投入生產(chǎn)使用 。
此外 , Toasty 試圖以當前的方式同時支持 SQL 和 NoSQL 是一種新的嘗試(據(jù)我所知) 。 如果您了解類似的嘗試 , 特別是過去的嘗試中遇到的困難 , 我非常樂意聽取您的意見 。 我也知道 , 許多人對數(shù)據(jù)庫、ORM 等方面有強烈的觀點 , 我期待這些討論 。 可以在 Tokio Discord 的 #toasty 頻道討論 。 另外 , 也可以在 Github 倉庫 上創(chuàng)建問題 , 提出功能建議或討論 API 設(shè)計和方向 。
【宣布 Toasty:Rust 的異步 ORM】——Carl Lerche

    推薦閱讀