爲你的 Rust 應用提供一個嵌入式的 NoSQL 數據庫

長期以來,SQLite 目前幾乎是客戶端數據存儲的唯一選擇,SQLite 是一個老而穩定的軟件,但它缺乏一些現代功能。然而,時代在變化,需求也在迅速變化。

在這篇文章中,我們將介紹 PoloDB。PoloDB 旨在爲 SQLite 提供一種現代的替代方案,支持多線程和多會話,並保留了 SQLite 的嵌入式和輕量級特性。

PoloDB 是一個用 Rust 編寫的嵌入式數據庫,如果你正在用 Rust 開發應用程序,PoloDB 將非常適合你,這是因爲 PoloDB 實現了輕量級的 MongoDB,本質上與 MongoDB 兼容。

創建項目

創建一個 Rust 項目:

cargo new polodb-example

在 Cargo.toml 文件中加入 PoloDB:

[dependencies]
polodb_core = "4.3.2"

創建數據庫

PoloDB 可以將數據存儲在內存中;也可以將數據存儲在文件中,持久化保存在磁盤上。

fn create_db(path: &str) -> Database {
    if path.is_empty() {
        Database::open_memory().unwrap()
    }else {
        Database::open_file("test-polo.db").unwrap()
    }
}

插入數據

要插入數據,請調用 insert 方法。插入數據之後,將返回一個 InsertResult 結構體。如果沒有提供主鍵,數據庫將創建一個主鍵,並在結果中獲取它。

#[derive(Debug, Serialize, Deserialize)]
struct Book {
    title: String,
    author: String,
}

fn insert_one(db: &Database) -> InsertOneResult {
    let collection = db.collection("books");
    collection.insert_one(Book {
        title: "The Three-Body Problem".to_string(),
        author: "Liu Cixin".to_string(),
    }).unwrap()
}

在上面的示例中,Book 結構被序列化爲 BSON 格式並保存在磁盤上。由於 PoloDB 是無結構的,因此不需要爲它創建表,它可以自由地插入任何形式的數據。

下面的例子演示插入多條數據:

fn insert_many(db: &Database) {
    let doc_collection = db.collection::<Document>("books");
    let docs = vec![
        doc! { "title""1984""author""George Orwell" },
        doc! { "title""Animal Farm""author""George Orwell" },
        doc! { "title""The Great Gatsby""author""F. Scott Fitzgerald" },
    ];
    doc_collection.insert_many(docs).unwrap();

    let book_collection = db.collection::<Book>("books");
    let books = vec![
        Book {
            title: "The Grapes of Wrath".to_string(),
            author: "John Steinbeck".to_string(),
        },
        Book {
            title: "To Kill a Mockingbird".to_string(),
            author: "Harper Lee".to_string(),
        },
    ];
    book_collection.insert_many(books).unwrap();
}

Collection 可以被參數化爲任何類型,只要它實現了 serde 庫的序列化和反序列化特性,而不僅僅是 Document。

查詢數據

在 PoloDB 中查詢也非常簡單,可以通過數據的字段來查詢 collection:

fn find(db: &Database) {
    let collection = db.collection::<Book>("books");

    let book = collection.find_one(doc! {"author""Liu Cixin"}).unwrap();
    println!("name: {:?}", book);

    let books = collection.find(None).unwrap();
    for book in books {
        println!("name: {:?}", book);
    }
}

find() 方法用於查詢符合特定查詢條件的文檔集合。當不帶參數調用 find() 方法時,將返回指向結果的遊標,你可以操縱遊標從數據庫中檢索數據。

如果需要更復雜的查詢,可以查看 PoloDB 的文檔。

修改數據

在 PoloDB 中修改一行或多行數據很容易。要修改行,需要爲要修改的行提供條件,並指定如何修改它們。

fn update(db: &Database) {
    let collection = db.collection::<Book>("books");
    collection.update_one(doc! {
        "author""Liu Cixin"
    }, doc! {
        "$set": doc! {
            "title""The Three-Body Problem 1",
        },
    }).unwrap();

    collection.update_many(doc! {
        "author""George Orwell"
    }, doc! {
        "$set": doc! {
            "title""xxxxx",
        },
    }).unwrap();
}

刪除數據

PoloDB 提供了 delete_one 和 delete_many 方法來刪除數據庫中的一行或多行。只需提供正確的過濾器參數來選擇要刪除的行:

fn delete(db: &Database) {
    let collection = db.collection::<Book>("books");
    collection.delete_one(doc! {
        "author""Liu Cixin"
    }).unwrap();

    collection.delete_many(doc! {
        "author""George Orwell"
    }).unwrap();
}

總結

PoloDB 是一個簡單但功能強大的數據庫系統,目前仍在開發中。本文演示了它的基本功能,它也有許多高級特性,如會話和事務。如果你感興趣,可以閱讀文檔並嘗試一下,我相信 PoloDB 會對你的應用有很大幫助。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UCP8eJvMUacHLfFAYYgdsA