2个不稳定版本

0.2.0 2022年5月24日
0.1.0 2021年10月21日

#2525数据库接口

Download history 32/week @ 2024-03-11 19/week @ 2024-03-18 23/week @ 2024-03-25 52/week @ 2024-04-01 15/week @ 2024-04-08 14/week @ 2024-04-15 22/week @ 2024-04-22 24/week @ 2024-04-29 13/week @ 2024-05-06 16/week @ 2024-05-13 18/week @ 2024-05-20 10/week @ 2024-05-27 24/week @ 2024-06-03 25/week @ 2024-06-10 10/week @ 2024-06-17 12/week @ 2024-06-24

72 次每月下载
用于 3 个crate(2个直接)

MIT 许可证

200KB
3K SLoC

arangors lite

arangors_lite 是由 fMeow 的 arangors 衍生而来。

Build Status MIT licensed Crates.io arangors dependency status

arangors 是一个直观的 ArangoDB Rust 客户端,受 pyArango 启发。

arangors 允许您连接到 ArangoDB 服务器,访问数据库,执行 AQL 查询,以简单直观的方式管理 ArangoDB,支持任何 HTTP 生态系统的异步和同步代码。

arangors 的哲学

arangors 针对的是 ArangoDB 的舒适、直观且类似 OOP 的 API,提供顶级和底层 API 供用户选择。

ArangoDB 的整体架构

数据库 -> 集合 -> 文档/边

实际上,arangors 的设计就是模仿这种架构,只是在顶级上,有一个数据库连接对象,包含一个带有身份验证信息的 HTTP 客户端。

arangors 的层次结构

连接 -> 数据库 -> 集合 -> 文档/边

功能

到目前为止,arangors 提供的功能有

  • 连接到 ArangoDB
  • 获取数据库和集合列表
  • 获取数据库和集合信息
  • 创建和删除数据库或集合
  • 完整的 AQL 查询功能
  • 支持异步和同步

概览

使用异步或同步代码

[dependencies]
## This one is async
arangors_lite = { version = "0.2" }
## This one is synchronous
arangors_lite = { version = "0.2", features = ["blocking"] }

由于 maybe_asyncarangors 可以统一同步和异步 API,并通过特性门进行切换。Arangors 采用异步优先策略。

默认情况下,reqwest 使用 OpenSSL。要使用 rustls,您可能需要禁用默认特性并使用 rustls 特性。

[dependencies]
## This one uses openssl
arangors_lite = { version = "0.2" }
## This one rustls
arangors_lite = { version = "0.2", features = ["rustls"], default-features = false }

连接

建立连接有三种方式

  • jwt
  • 基本认证
  • 无认证

arangors API 也是如此。

示例

  • 带有认证
use arangors_lite::Connection;

// (Recommended) Handy functions
let conn = Connection::establish_jwt("https://127.0.0.1:8529", "username", "password")
    .await
    .unwrap();
let conn = Connection::establish_basic_auth("https://127.0.0.1:8529", "username", "password")
    .await
    .unwrap();
  • 无认证,仅在评估设置中使用
let conn = Connection::establish_without_auth("https://127.0.0.1:8529").await.unwrap();

数据库 && 集合

use arangors_lite::Connection;

let db = conn.db("test_db").await.unwrap();
let collection = db.collection("test_collection").await.unwrap();

AQL 查询

所有与 AQL 查询相关的函数都关联到数据库,因为 AQL 查询是在数据库级别执行的。

执行 AQL 查询有几种方法,可以分为两大类

  • 带有游标的批量查询

    • aql_query_batch
    • aql_next_batch
  • 查询以获取所有结果

    • aql_str
    • aql_bind_vars
    • aql_query

后者提供了方便的高级 API,而批量查询则提供了更多控制。

类型化或非类型化

请注意,来自 ArangoDB 服务器的结果(例如获取的文档)可以给定可反序列化的结构或任意 JSON 对象作为强类型,使用 serde::Value


#[derive(Deserialize, Debug)]
struct User {
    pub username: String,
    pub password: String,
}

// Typed
let resp: Vec<User> = db
    .aql_str("FOR u IN test_collection RETURN u")
    .await
    .unwrap();
// Not typed: Arbitrary JSON objects
let resp: Vec<serde_json::Value> = db
    .aql_str("FOR u IN test_collection RETURN u")
    .await
    .unwrap();

批量查询

arangors 提供了一种手动处理批量查询的方法。

使用 aql_query_batch 获取游标,并使用 aql_next_batch 获取下一个批次,并使用游标更新游标。



let aql = AqlQuery::new("FOR u IN @@collection LIMIT 3 RETURN u")
    .bind_var("@collection", "test_collection")
    .batch_size(1)
    .count(true);

// fetch the first cursor
let mut cursor = db.aql_query_batch(aql).await.unwrap();
// see metadata in cursor
println!("count: {:?}", cursor.count);
println!("cached: {}", cursor.cached);
let mut results: Vec<serde_json::Value> = Vec::new();
loop {
    if cursor.more {
        let id = cursor.id.unwrap().clone();
        // save data
        results.extend(cursor.result.into_iter());
        // update cursor
        cursor = db.aql_next_batch(id.as_str()).await.unwrap();
    } else {
        break;
    }
}
println!("{:?}", results);

获取所有结果

有三种 AQL 查询函数可以获取 ArangoDB 的所有结果。这些函数内部依次获取批量结果以获取所有结果。

获取所有结果的函数如下所示

aql_str

此函数只接受 AQL 查询字符串。

下面是使用 aql_str 的强类型查询结果的示例


#[derive(Deserialize, Debug)]
struct User {
    pub username: String,
    pub password: String,
}

let result: Vec<User> = db
    .aql_str(r#"FOR i in test_collection FILTER i.username=="test2" return i"#)
    .await
    .unwrap();
aql_bind_vars

此函数可以用于使用绑定变量开始 AQL 查询。

use arangors_lite::{Connection, Document};

#[derive(Serialize, Deserialize, Debug)]
struct User {
    pub username: String,
    pub password: String,
}


let mut vars = HashMap::new();
let user = User {
    username: "test".to_string(),
    password: "test_pwd".to_string(),
};
vars.insert("user", serde_json::value::to_value(&user).unwrap());
let result: Vec<Document<User>> = db
    .aql_bind_vars(r#"FOR i in test_collection FILTER i==@user return i"#, vars)
    .await
    .unwrap();
aql_query

此函数提供了调整 AQL 查询的所有选项。用户必须首先构建一个 AqlQuery 对象。然后 AqlQuery 提供了调整 AQL 查询所需的所有选项。您可以设置批次大小、添加绑定变量、限制内存,以及所有其他选项。

use arangors_lite::{AqlQuery, Connection, Cursor, Database};
use serde_json::value::Value;


let aql = AqlQuery::new("FOR u IN @@collection LIMIT 3 RETURN u")
    .bind_var("@collection", "test_collection")
    .batch_size(1)
    .count(true);

let resp: Vec<Value> = db.aql_query(aql).await.unwrap();
println!("{:?}", resp);

贡献

欢迎遵循 Github 工作流程进行贡献和反馈。

许可证

arangors 在 MIT 许可证下提供。请参阅 LICENSE。Rust 的一个符合人体工程学的 ArangoDB 客户端。

依赖项

~4–20MB
~285K SLoC