#surrealdb #query-builder #surreal #db #surrealql

surreal_derive_plus

surrealdb查询构建器

14个稳定版本

1.0.17 2024年7月28日
1.0.16 2024年7月27日
1.0.13 2024年6月26日
1.0.11 2024年3月17日
1.0.6 2023年10月23日

#141过程宏

Download history 299/week @ 2024-06-07 27/week @ 2024-06-14 205/week @ 2024-06-21 35/week @ 2024-06-28 12/week @ 2024-07-05 110/week @ 2024-07-19 358/week @ 2024-07-26 23/week @ 2024-08-02

每月下载量 491

MIT 许可证

38KB
687

Surreal derive

描述

一个简单的库,用于编写SurrealQL ,这只是在SurrealDb Rust SDK之上的一层薄薄的封装。

处理RecordId和Relate语句的有意思的解决方案

请查看我的其他crate,名为surrealdb-id

安装

1. 安装surreal-devl: https://crates.io/crates/surreal_devl

包含整个库的核心逻辑,主要目的是作为SurrealDb SDK与您定义的Struct之间的桥梁,也支持与数组IDDateTime一起工作

cargo add sureal_devl

2. 安装surreal-derive

cargo add surreal_derive_plus

注意

当前限制将在未来解决:如果您的变量名与以下支持的语句中的任何之一冲突:["id", "val", "date", "duration", "record", "set", "content", "multi", "array"],请考虑重命名它们。

用法

将您的struct标记为surreal_derive。

这将自动生成代码,可以将您的struct转换为surrealdb惯用语

use serde::{Deserialize, Serialize};
use surreal_derive_plus::SurrealDerive;

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

实现Into/surrealdb::value::RecordId特质

use surrealdb::opt::RecordId;
use crate::entities::user::User;

impl Into<RecordId> for User {
    fn into(self) -> RecordId {
        return RecordId::from(("user", self.name.as_str()));
    }
}

使用surreal_derive_plus::surreal_quote!宏编写查询

结构体

use surreal_derive_plus::surreal_quote;
.... connect to your surreal db ...
    
let new_user = User {
    name: "surreal".to_string(),
    password: "000000".to_string(),
};

let created_user: Option<entities::user::User> = DB.query(surreal_quote!("CREATE #record(&new_user)")).await.unwrap().take(0).unwrap(); => CREATE user:surreal SET name='surreal', password='000000'

变量

let age = 2;
let query_statement = surreal_derive_plus::surreal_quote!("CREATE user SET age = #age");

assert_eq!(query_statement, "CREATE user SET age = 2");

数组

let arr = vec![1,2,3,1];
let query_statement = surreal_derive_plus::surreal_quote!("CREATE user SET arr = #array(&arr)");

assert_eq!(query_statement, "CREATE user SET arr = [1, 2, 3, 1]");

结构体数组

let friends = vec![
    User {
        name: "Ethan".to_string(),
        full_name: "Ethan Sullivan".to_string(),
        password: "123123".to_string(),
    },
    User {
        name: "Olivia".to_string(),
        full_name: "Olivia Anderson".to_string(),
        password: "123123".to_string(),
    }
];

let query_statement = surreal_derive_plus::surreal_quote!("CREATE user SET friends = #array(&friends)");
assert_eq!(query_statement, "CREATE user SET friends = [user:Ethan, user:Olivia]");

日期时间

let birthday: DateTime<Utc> = Utc.with_ymd_and_hms(2020, 1, 1, 0, 0, 0).unwrap();
let query_statement = surreal_derive_plus::surreal_quote!("CREATE user SET birthday = #date(&birthday)");

assert_eq!(query_statement, "CREATE user SET birthday = '2020-01-01T00:00:00Z'");

持续时间

let party_duration = Duration::from_millis(2 * 60 * 60 * 1000);
let party_started_at: DateTime<Utc> = Utc.with_ymd_and_hms(2023, 1, 1, 14, 0, 0).unwrap();
let query_statement = surreal_derive_plus::surreal_quote!("CREATE party SET duration = #duration(&party_duration), #date(&party_started_at)");
assert_eq!(query_statement, "CREATE party SET duration = 2h, '2023-01-01T14:00:00Z'");

Surreal ID

let user =  User {
    name: "clay".to_string(),
    full_name: "clay".to_string(),
    password: "123123".to_string(),
};

let query_statement = surreal_derive_plus::surreal_quote!("UPDATE #id(&user) SET age = 10");

assert_eq!(query_statement, "UPDATE user:clay SET age = 10");

Surreal值

这将使用surrealdb::sql::Value::from()将变量封装起来

let str = String::from("string");
let statement = surreal_derive_plus::surreal_quote!("CREATE user SET full_name = #val(&str)");
assert_eq!(statement, "CREATE user SET full_name = 'string'");

关系

使用surrealdb-id crate,我们可以简化处理relate语句的过程,然后您可以生成整个relate语句

链接: https://crates.io/crates/surrealdb_id

示例

let user: RecordId = RecordId::from(("user", "Devlog"));
let blogPost: RecordId = RecordId::from(("blogPost", "How to use surrealdb"));
let discussion = Discussion { content: "Hello I really want to know more".to_string(), created_at: Default::default() };
let relation = discussion.relate(user, blogPost)

assert_eq!(
    surreal_quote!("#relate(&relation)"),
    "RELATE user:Devlog -> discuss -> blogPost:⟨How to use surrealdb⟩ SET content = 'Hello I really want to know more', created_at = '1970-01-01T00:00:00Z'"
);

超现实资源

let new_user = User {
    name: "surreal".to_string(),
    password: "000000".to_string(),
};

db.create(Resource::RecordId(new_user.id())).content(&user);

自定义设置

您可以在 cargo.toml 中自定义设置,调用 cargo clean 以应用所有这些配置是必要的。

[package.metadata]
# Will log the query command at runtime
surreal_enable_log = false
# Will log the generated code at build time
surreal_enable_compile_log = false
# Change the naming convention of generated statement into camel case
surreal_use_camel_case = false
# The log namespace, apply for both build time log and runtime log
surreal_namespace = "surrealql-derive"
# The macro name that use for info log, for example
surreal_info_log_macro = "println"
# The macro name that use for warning log, for example
surreal_warn_log_macro = "println"

依赖项

~37–71MB
~1M SLoC