#surrealdb #sql #sqlbuilder #garbage-collection #json-toml

surrealism

Rust对SurrealDB官方库的扩展,旨在简化并统一各种操作

7个版本

0.3.1 2023年11月4日
0.3.0 2023年10月24日
0.2.2 2023年9月22日
0.2.0 2023年8月30日
0.1.1 2023年6月17日

#297数据库接口

MIT 协议

310KB
6K SLoC

Surrealism

LICEMSE

MIT

Surrealism 简介

Surrealism基于Surrealdb提供的Rust官方标准库:surrealdb,目的是构建一种更加统一、简单的方式来操作Surrealdb数据库

Surrealism依赖于Surrealdb的官方Rust标准库:surrealdb,目的是构建一种更加统一、简单的方式来执行对Surrealdb数据库的各种操作

快速入门

添加依赖

[dependencies]
surrealism = {version="0.3.1"}
tokio = { version = "1.28.0", features = ["macros", "rt-multi-thread"] }

添加配置

配置:

username:用户名
password:密码
local:本机连接(本机使用ws,远程使用wss)
bind: 连接地址,
auth:开启权限认证
tick_interval:运行节点代理tick的间隔(包括垃圾收集),默认为10秒
strict:严格模式
mode:连接模式(Memory表示内存File表示存到文件中,Tikv表示tikv集群地址)
path:存储到文件中的文件地址,使用Memory则无需设置
log:日志级别
query_timeout:设置查询超时时间
transaction_timeout: 事务超时时间
no_banner: 打印Banner
db_connection: 数据库连接行为
http_server: 服务器行为
capabilities: 能力

可以采用JSON或TOML两种配置文件方式

设置配置文件地址可以是:

  • ./Surrealism.toml
  • ./configs/Surrealism.toml
  • ./templates/Surrealism.toml

配置:

username: db username
password: db password
local: Local connection (using ws locally, using wss remotely)
bind: Connection address,
auth:Enable permission authentication
tick_interval:The interval between running node agent tickets (including garbage collection), which defaults to 10 seconds
strict:strict mode
mode:Connection mode (Memory represents memory, File represents storage to file, Tikv represents Tikv cluster address)
path:The file address stored in the file, which does not need to be set when using Memory
log:log level
query_timeout:Set query timeout time
transaction_timeout: Transaction timeout time
no_banner: Print Banner
db_connection: database connection behavior
http_server: server behavior
capabilities: db Capabilities

可以使用两种配置文件方法:JSON或TOML

配置文件地址可以设置为:

  • ./Surrealism.toml
  • ./configs/Surrealism.toml
  • ./templates/Surrealism.toml

Surrealism.json(JSON)

{
	"username" : "root",
	"password" : "syf20020816",
	"bind" : "127.0.0.1:10086",
	"mode" : "Memory",
	"log" : "Info",
    "local": true,
}

Surrealism.toml(TOML)

[default]
username = "root"
password = "syf20020816"
bind = "127.0.0.1:10086"
mode = "Memory"
log = "Info"
local = true

open surrealdb

打开surrealdb

image-20231024165545355

首先定义ns,db,table

image-20231024165607517

main.rs

use surrealism::db::{SurrealID, Table};
use surrealism::builder::{BaseWrapperImpl, SQLBuilderFactory, TableImpl};
use surrealism::builder::create::{CreateWrapper, CreateWrapperImpl};
use serde::{Serialize, Deserialize};
use surrealism::builder::select::SelectWrapperImpl;
use surrealism::surreal::{parse_response, SurrealismRes,DefaultInitService,UseNSDB,InitService,SurrealismCommit};

#[derive(Debug, Clone, Serialize, Deserialize)]
struct User {
    username: String,
    pwd: String,
    male: bool,
    age: u8,
}

/// create a new user table
/// table_name:user
/// table_id:surrealism
pub fn crate_user_table() -> CreateWrapper {
    // create a user data
    let user = User {
        username: "Tobie".to_string(),
        pwd: "Tobie001".to_string(),
        male: true,
        age: 23,
    };
    // create table with content
    let user_table = SQLBuilderFactory::create()
        .table("user")
        .id("surrealism".into())
        .content(&user)
        .deref_mut();
    user_table
}

//strict!
#[tokio::main]
async fn main() -> SurrealismRes<()> {
    // init service
    let mut service = DefaultInitService::new().init();
    // you have already define test namespace and test database!
    // use ns:test and db:test
    let _ = service.use_commit("test", "test").await?;
    // get info from surrealdb
    // let info = SQLBuilderFactory::info().db().build();
    // let info_res = service.commit_sql(&info).await?;
    // dbg!(info_res);
    // create a table (you should define user table first!)
    let create_stmt = crate_user_table().build();
    let _ = service.commit_sql(&create_stmt).await?;
    // dbg!(create_res);
    // select user::surrealism table
    let select = SQLBuilderFactory::select().table("user").id("surrealism".into()).column("*", None).build();
    let select_res = service.commit_sql(&select).await?;
    //parse response to any type you want
    let res: User = parse_response(select_res);
    // [tests\src\main.rs:55] res = User {
    //     username: "Tobie",
    //     pwd: "Tobie001",
    //     male: true,
    //     age: 23,
    // }
    dbg!(&res);
    Ok(())
}

终端结果

   ▄▄▄▄                                                      ▄▄▄▄         ██
 ▄█▀▀▀▀█                                                     ▀▀██         ▀▀
 ██▄       ██    ██   ██▄████   ██▄████   ▄████▄    ▄█████▄    ██       ████     ▄▄█████▄  ████▄██▄
  ▀████▄   ██    ██   ██▀       ██▀      ██▄▄▄▄██   ▀ ▄▄▄██    ██         ██     ██▄▄▄▄ ▀  ██ ██ ██
      ▀██  ██    ██   ██        ██       ██▀▀▀▀▀▀  ▄██▀▀▀██    ██         ██      ▀▀▀▀██▄  ██ ██ ██
 █▄▄▄▄▄█▀  ██▄▄▄███   ██        ██       ▀██▄▄▄▄█  ██▄▄▄███    ██▄▄▄   ▄▄▄██▄▄▄  █▄▄▄▄▄██  ██ ██ ██
  ▀▀▀▀▀     ▀▀▀▀ ▀▀   ▀▀        ▀▀         ▀▀▀▀▀    ▀▀▀▀ ▀▀     ▀▀▀▀   ▀▀▀▀▀▀▀▀   ▀▀▀▀▀▀   ▀▀ ▀▀ ▀▀

2023-10-24T08:54:49.323Z INFO  [surrealism::core::surreal::config::init::default] Welcome to use Surrealism!
2023-10-24T08:54:49.323Z INFO  [surrealism::core::surreal::config::init::default] Init Service : `Config Service` Successfully!
2023-10-24T08:54:49.329Z INFO  [surrealism::core::surreal::config::init::default] Please focus following print to check!
Version {
    router: Ok(
        Router {
            conn: PhantomData<surrealdb::api::engine::remote::ws::Client>,
            sender: Sender,
            last_id: 1,
            features: {},
        },
    ),
}
2023-10-24T08:54:49.329Z INFO  [surrealism::core::surreal::config::init::default] Init Service : `Connection Service` Successfully!
[tests\src\main.rs:63] &res = User {
    username: "Tobie",
    pwd: "Tobie001",
    male: true,
    age: 23,
}

Surrealism 全部支持

特性

default = ["builder"]
row = []
builder = []
surreal = ["builder"]
full = ["row", "builder", "surreal"]

配置文件配置

  • Surrealism.json支持
  • Surrealism.toml支持
  • 自定义构建支持(SurrealismConfig)

Init 初始化服务

  • DefaultInitService 默认初始化服务的支持
  • 自定义初始化服务的支持

ID 表ID

  • SurrealID::Default的支持
  • SurrealID::Int的支持
  • SurrealID::Float的支持
  • SurrealID::String的支持
  • SurrealID::Array的支持
  • SurrealID::UUID的支持
  • SurrealID::ULID的支持
  • SurrealID::RAND的支持
  • SurrealID::Range的支持

Value 数据类型

  • SurrealValue::None的支持
  • SurrealValue::Null的支持
  • SurrealValue::Int的支持
  • SurrealValue::Float的支持
  • SurrealValue::Decimal的支持
  • SurrealValue::String的支持
  • SurrealValue::Object的支持
  • SurrealValue::Datetime的支持(DatetimeAdapter)
  • SurrealValue::Duration的支持(DurationAdapter)
  • SurrealValue::Array的支持
  • SurrealValue::Set的支持
  • SurrealValue::Option的支持
  • SurrealValue::Geo的支持
  • SurrealValue::Record的支持
  • SurrealValue::Future的支持
  • 数学常数构建
  • 数学常数支持

Builder

  • USE STMT (连接中)
  • CREATE STMT
  • SELECT STMT
  • LIVE SELECT STMT
  • RELATE STMT
  • UPDATE STMT
  • INSERT STMT
  • DELETE STMT
  • INFO STMT
  • TRANSACTION STMT
  • DEFINE STMT
  • REMOVE STMT
  • SLEEP STMT
  • LET STMT
  • BEGIN STMT
  • CANCEL STMT
  • COMMIT STMT
  • IF ELSE STMT
  • FOR STMT
  • BREAK STMT
  • CONTINUE STMT
  • KILL STMT
  • THROW STMT
  • RETURN STMT

使用

  • USE NS STMT
  • USE DB STMT

创建

  • 创建内容语句
  • 创建集合语句
  • RETURN STMT
  • 超时语句
  • 并行语句

插入

  • 插入到语句
  • 重复键更新语句

选择

  • 字段
  • 省略
  • 带索引|不带索引
  • WHERE
  • 分割
  • 分组
  • 排序
  • 限制
  • 开始
  • 获取
  • 超时
  • 并行
  • EXPLAIN [完整]

实时选择

  • 字段
  • WHERE
  • 获取

删除

  • 删除WHERE
  • 返回
  • 超时
  • 并行
  • 带相关删除

移除

  • 命名空间
  • 数据库
  • 用户
  • 登录
  • 令牌
  • 范围
  • 事件
  • 函数
  • 字段
  • 索引
  • 参数

更新

  • 内容
  • 合并
  • 修补
  • 设置
  • WHERE
  • 返回
  • 超时
  • 并行

定义

  • 命名空间
  • 数据库
  • 用户
  • 登录
  • 令牌
  • 范围
  • 事件
  • 函数
  • 字段
  • 索引
  • 参数
  • 分析器

信息

  • KV
  • NS
  • DB
  • 范围

显示

  • 自从
  • 限制

睡眠

  • 持续时间

断言

  • ASSERT
  • WHERE
  • 条件
  • 标准

函数

  • 数组
  • 计数
  • 加密
  • 持续时间
  • 地理
  • HTTP
  • 数学
  • 元数据
  • 解析
  • 随机
  • 搜索
  • 会话
  • 睡眠
  • 字符串
  • 时间
  • 类型
  • 脚本
  • 向量

  • RowSql的支持
  • row_sql!宏

运算符

运算符 描述 完成
&&或AND 检查两个值是否都为真值
||或OR 检查两个值中是否有一个为真值
?? 检查两个值中是否有一个为真值且不为NULL
?: 检查两个值中是否有一个为真值
=或IS 检查两个值是否相等
!=或IS NOT 检查两个值是否不相等
== 检查两个值是否完全相等
?= 检查集合中的任何值是否等于某个值
*= 检查集合中的所有值是否等于某个值
~ 使用模糊匹配比较两个值是否相等
!~ 使用模糊匹配比较两个值是否不相等
?~ 使用模糊匹配检查集合中的任何值是否等于某个值
*~ 使用模糊匹配检查集合中的所有值是否等于某个值
< 检查一个值是否小于另一个值
<= 检查一个值是否小于或等于另一个值
> 检查一个值是否大于另一个值
>= 检查一个值是否大于或等于另一个值
+ 将两个值相加
- 从一个值中减去另一个值
*或× 将两个值相乘
/或÷ 将一个值除以另一个值
** 将一个基数值提升到另一个值
IN 检查一个值是否包含在另一个值中
NOT IN 检查一个值是否不包含在另一个值中
CONTAINS 检查一个值是否包含另一个值
CONTAINSNOT 检查一个值是否不包含另一个值
CONTAINSALL 检查一个值是否包含所有其他值
CONTAINSANY 检查一个值是否包含任何其他值
CONTAINSNONE 检查一个值是否包含以下所有值
INSIDE 检查一个值是否包含在另一个值中
NOTINSIDE 检查一个值是否不包含在另一个值中
ALLINSIDE 检查所有值是否包含在其他值中
ANYINSIDE 检查任何值是否包含在其他值中
NONEINSIDE 检查没有值包含在其他值中
OUTSIDE 检查一个几何类型是否在另一个几何类型之外
INTERSECTS 检查一个几何类型是否与另一个几何类型相交
@@ 检查术语是否在全文索引字段中找到

更新描述

  • 0.3.1:

    • 重构Define语句并补全DEFINE ANALYSIS(重构Define语句并完成DEFINE ANALYSIS)
    • 支持Return语句(支持Return语句)
    • 支持Kill语句(支持Kill语句)
    • 支持Throw语句(支持Throw语句)
    • 支持所有SurrealDB的运算符,见CriteriaSign(支持所有SurrealDB运算符,见CriteriaSign)
  • 0.3.0:

    • 重构init Service 和 config Service(重构init服务和服务配置)
    • 优化SurrealValue(优化SurrealValue)
    • 优化Field(优化字段)
    • 增加With(增加With)
    • 增加ShowWrapper(增加ShowWrapper)
    • 优化SurrealDB 0.1.0版本更新的基础语句语法(优化SurrealDB 0.1.0版本更新的基本语句语法)
  • 0.2.2:

    • 添加SelectWrapper向LiveSelectWrapper的转变(添加SelectWrapper向LiveSelectWrapper的转变)
    • 添加Field::Diff,针对LiveSelect语句的构建(添加Field::Diff,针对LiveSelect语句的构建)
    • 添加SurrealValue对Geometries的支持,GeoJSON(添加SurrealValue对几何形状的支持,GeoJSON)
    • 添加所有内置方法Function(突然有些困惑,延迟至下个版本)(添加所有内置方法Function,突然有些困惑,延迟至下个版本)
    • 补充ValueTyped类型Geometries,Decimal,Option(补充ValueTyped类型的几何形状、Decimal、Option)
    • 添加ValueConstructor的new_infer()用于通过默认值推测值类型(添加ValueConstructor的new_infer()用于通过默认值推测值类型)
  • 0.2.1:

    • 添加SurrealDB内置方法Function(添加SurrealDB内置方法Function)
      • Function::array
      • Function::count
      • Function::crypto
    • 修复RELATE语句构造错误的问题,感谢timlagrande <notifications@github.com>(修复RELATE语句构造错误的问题,感谢timlagrande <notifications@github.com>
    • SELECT语句Column构建添加AS关键字功能(SELECT语句Column构建添加AS关键字功能)
    • SurrealDB内置加密功能,见surrealism::functions::{GenerateCompare, CryptoFunc}(SurrealDB内置加密功能,见surrealism::functions::{GenerateCompare, CryptoFunc}
  • 0.2.0:

    • 重构了各类Wrapper,使用简单统一的构造器+工厂模式(重构了各类Wrapper,使用简单统一的构造器+工厂模式)

    • 增加row sql进行语句构建(增加row sql进行语句构建)

    • 启动与初始化更新,你可以基于框架提供的trait和struct自己构建初始化服务(启动与初始化更新,你可以基于框架提供的trait和struct自己构建初始化服务)

    • 增加大量构建工具(增加大量构建工具)

    • 分离语句构造和语句提交(分离语句构造和语句提交)

  • 0.1.1:更新配置,增加基于Namespace和Database的支持,但是基于当前SurrealDB无法支持,所以并不能使用🥲(0.1.1:更新配置,增加基于Namespace和Database的支持,但是基于当前SurrealDB无法支持,所以并不能使用🥲)

依赖

~44–80MB
~1.5M SLoC