手把手教你用axum開發(fā)博客系統(tǒng)五: sea-orm使用(一)

web項目中坯台,我們一般不直接拼接sql 語句扣蜻,而是選擇一個orm來進行操作數(shù)據庫,本文和大家一起學習sea-orm 的使用

添加依賴

使用 cargo new sea-orm-demo 新建項目对人,并在Cargo.toml中添加sea-orm依賴

sea-orm的features 有較多可選項暂筝,主要是根據你所使用的數(shù)據庫類型和要使用的異步運行時進行選擇,macros 也是個常用feature, 因為我們大概率會使用sea-orm-cli來生成實體和模型右遭,macros feature 提供的宏可以幫我們節(jié)省很多代碼

  • runtime-tokio-native-tls做盅,可以理解為使用tokio 作為異步運行時, native-tls 表示使用原生的tls實現(xiàn)窘哈;其他可選feature還有
    • runtime-async-std-native-tls
    • runtime-async-std-rustls
    • runtime-tokio-rustls
  • sqlx-mysql表示我們使用mysql作為數(shù)據庫驅動吹榴,sea-orm還支持postgres, sqlite ,只需激活相應的feature 即可
    • sqlx-postgres
    • sqlx-sqlite
...
[dependencies.sea-orm]
version = "0.12.15"
features = ["runtime-tokio-native-tls", "macros", "debug-print", "sqlx-mysql"]
...

使用migrate創(chuàng)建數(shù)據表

創(chuàng)建數(shù)據表滚婉,我們可以通過原生sql創(chuàng)建图筹,也可以通過sea-orm編寫純rust代碼執(zhí)行創(chuàng)建

安裝sea-orm-cli

sea-orm-clisea-orm官方 提供的工具鏈,可以通過cargo 直接安裝

cargo install sea-orm-cli

初始化 migrate目錄

  • 在項目根目錄執(zhí)行如下命令,會創(chuàng)建一個migration 目錄远剩,該目錄是一個完整的binary crate
sea-orm-cli migrate init
  • 修改 migration/Cargo.toml 扣溺,將feature配置為與項目一致
[dependencies.sea-orm-migration]
version = "0.12.15"
features = [
  "runtime-tokio-native-tls",
  "sqlx-mysql",
]
  • migration/src目錄下存在名稱格式為 m日期_時間_遷移名稱.rs 的文件,這個文件就是sea-orm的遷移文件瓜晤;新創(chuàng)建的migration默認包含一個遷移文件锥余; 如果要新建一個遷移文件,執(zhí)行如下命令
// 根目錄執(zhí)行
sea-orm-cli migrate generate create_user

此時migration/src 下會新建一個名稱格式類似 m20240731_123456_create_user.rs 的文件痢掠,將其作為模塊在 lib.rs 里導入驱犹,并按格式追加到lib.rsmigrations 方法即可

pub use sea_orm_migration::prelude::*;

mod m20220101_000001_create_table;
mod m20240730_000001_create_user;

pub struct Migrator;
#[async_trait::async_trait]
impl MigratorTrait for Migrator {
    fn migrations() -> Vec<Box<dyn MigrationTrait>> {
        vec![
                        Box::new(m20220101_000001_create_table::Migration),
                        **Box::new(m20240730_000001_create_user::Migration),**
                ]
    }
}

本文僅為演示,將直接修改默認遷移文件

編輯遷移文件

我們將通過migration創(chuàng)建一個user

原生sql表示為

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

編輯遷移文件

use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(User::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(User::Id)
                            .integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(ColumnDef::new(User::Username).string().not_null())
                    .col(ColumnDef::new(User::Password).string().not_null())
                    .to_owned(),
            )
            .await
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .drop_table(Table::drop().table(User::Table).to_owned())
            .await
    }
}

#[derive(DeriveIden)]
enum User {
    Table,
    Id,
    Username,
    Password,
}

主要關注遷移文件里的 up, down 方法足画,up是執(zhí)行雄驹,down是回退

執(zhí)行遷移命令

sea-orm-cli migrate up -u mysql://root:123456@localhost:3306/sea-demo

連接到sea-demo數(shù)據庫可以看到創(chuàng)建了 user 表和 seaql_migrations 表,其中user表是我們指定創(chuàng)建的表淹辞,seaql_migrations 是自動創(chuàng)建的記錄遷移記錄的表医舆,以免遷移沖突;

下節(jié)我們將一起學習使用sea-orm執(zhí)行增刪改查

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末象缀,一起剝皮案震驚了整個濱河市蔬将,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攻冷,老刑警劉巖娃胆,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異等曼,居然都是意外死亡,警方通過查閱死者的電腦和手機凿蒜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門禁谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人废封,你說我怎么就攤上這事州泊。” “怎么了漂洋?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵遥皂,是天一觀的道長。 經常有香客問我刽漂,道長演训,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任贝咙,我火速辦了婚禮样悟,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己窟她,他們只是感情好陈症,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震糖,像睡著了一般录肯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吊说,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天论咏,我揣著相機與錄音,去河邊找鬼疏叨。 笑死潘靖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蚤蔓。 我是一名探鬼主播卦溢,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秀又!你這毒婦竟也來了单寂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吐辙,失蹤者是張志新(化名)和其女友劉穎宣决,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昏苏,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡尊沸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贤惯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼专。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孵构,靈堂內的尸體忽然破棺而出屁商,到底是詐尸還是另有隱情,我是刑警寧澤颈墅,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布蜡镶,位于F島的核電站,受9級特大地震影響恤筛,放射性物質發(fā)生泄漏官还。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一叹俏、第九天 我趴在偏房一處隱蔽的房頂上張望妻枕。 院中可真熱鬧,春花似錦、人聲如沸屡谐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愕掏。三九已至度秘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饵撑,已是汗流浹背剑梳。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滑潘,地道東北人垢乙。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像语卤,于是被迫代替她去往敵國和親追逮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容