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 在 数据库接口
310KB
6K SLoC
Surrealism
- 作者:[email protected]
- docName:Surrealism README
- createDate:2023年5月6日
- updateDate:2023年11月4日
- version:0.3.1
- email:[email protected]
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
首先定义ns,db,table
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}
)
- 添加SurrealDB内置方法Function(添加SurrealDB内置方法Function)
-
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