Rust数据库引擎surrealdb-core-nightly的使用:高性能NoSQL与SQL混合查询的嵌入式数据库解决方案
Rust数据库引擎surrealdb-core-nightly的使用:高性能NoSQL与SQL混合查询的嵌入式数据库解决方案
关于SurrealDB Core
这个crate是SurrealDB的内部核心库。它包含了大部份数据库功能,surrealdb二进制文件就是在此基础上实现的。这个crate不应该在SurrealDB之外使用。如需使用稳定的SurrealDB库接口,请使用Rust SDK。
安装
在项目目录中运行以下Cargo命令:
cargo add surrealdb-core-nightly
或者在Cargo.toml中添加以下行:
surrealdb-core-nightly = "3.0.20250804085936"
完整示例代码
以下是使用surrealdb-core-nightly进行高性能NoSQL与SQL混合查询的嵌入式数据库解决方案的完整示例:
use surrealdb_core_nightly as surrealdb;
use surrealdb::sql::{Value, Array, Object};
use surrealdb::dbs::Session;
use surrealdb::kvs::Datastore;
#[tokio::main]
async fn main() -> surrealdb::Result<()> {
// 创建嵌入式数据库存储
let ds = Datastore::new("memory").await?;
// 创建数据库会话
let ses = Session::owner();
// 创建示例数据
let person = Object::from(vec![
("name", Value::from("John Doe")),
("age", Value::from(32)),
("hobbies", Value::from(Array::from(vec![
Value::from("coding"),
Value::from("reading"),
]))),
]);
// 使用NoSQL风格插入数据
let sql = r#"
INSERT INTO person {
name: "John Doe",
age: 32,
hobbies: ["coding", "reading"]
}
"#;
ds.execute(sql, &ses, None, false).await?;
// 使用SQL风格查询数据
let sql = "SELECT * FROM person WHERE age > 30";
let res = ds.execute(sql, &ses, None, false).await?;
println!("SQL查询结果: {:?}", res);
// 混合查询示例
let sql = r#"
SELECT
name,
hobbies[0] as primary_hobby,
age > 30 as is_adult
FROM person
"#;
let res = ds.execute(sql, &ses, None, false).await?;
println!("混合查询结果: {:?}", res);
Ok(())
}
特性说明
- 嵌入式数据库:可以直接在内存中运行,无需额外服务器
- NoSQL支持:支持JSON风格的文档插入和查询
- SQL支持:支持传统SQL查询语法
- 混合查询:可以在SQL查询中嵌入NoSQL风格的文档操作
注意事项
- 此crate是SurrealDB内部核心库,不建议在生产环境中直接使用
- 如需稳定API,请使用官方Rust SDK
- 此示例仅展示基本功能,实际使用中可能需要更多配置和错误处理
文档与支持
此crate属于以下分类:
- Database implementations
- Embedded development
- Data structures
1 回复
SurrealDB Core Nightly: 高性能NoSQL与SQL混合查询的嵌入式数据库解决方案
简介
SurrealDB是一个新兴的多模型数据库,结合了NoSQL的灵活性和SQL的强大查询能力。surrealdb-core-nightly
是其Rust实现的核心引擎版本,提供了嵌入式数据库解决方案。
主要特性
- 混合查询能力:同时支持文档型NoSQL查询和传统SQL查询
- 嵌入式设计:可作为库直接集成到Rust应用中
- 高性能:针对Rust环境优化,利用Rust的内存安全特性
- 多模型支持:文档、图数据库、键值存储等功能
- 实时能力:支持实时数据同步和订阅
使用方法
基本使用示例
use surrealdb_core_nightly as surreal;
use surreal::sql::{value, thing, json};
use surreal::dbs::Session;
use surreal::kvs::Datastore;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建内存数据库实例
let ds = Datastore::new("memory").await?;
let ses = Session::owner();
// 创建表
let sql = "DEFINE TABLE user SCHEMALESS";
ds.execute(sql, &ses, None).await?;
// 插入数据
let sql = "CREATE user:john SET name = 'John Doe', age = 31";
ds.execute(sql, &ses, None).await?;
// 查询数据
let sql = "SELECT * FROM user WHERE age > 30";
let res = ds.execute(sql, &ses, None).await?;
println!("查询结果: {:?}", res);
Ok(())
}
高级查询示例
// 关系查询示例
let sql = r#"
CREATE article:rust SET title = 'Rust数据库引擎', author = user:john;
SELECT author.name FROM article WHERE title CONTAINS 'Rust'
"#;
let res = ds.execute(sql, &ses, None).await?;
// 图查询示例
let sql = r#"
RELATE user:john->likes->article:rust SET time = time::now();
SELECT ->likes->article.title FROM user:john
"#;
let res = ds.execute(sql, &ses, None).await?;
完整示例Demo
以下是一个完整的SurrealDB Core Nightly使用示例,包含数据建模、CRUD操作、关系查询和实时订阅:
use surrealdb_core_nightly as surreal;
use surreal::dbs::Session;
use surreal::kvs::Datastore;
use futures::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 初始化内存数据库
let ds = Datastore::new("memory").await?;
let ses = Session::owner();
// 2. 定义数据模型
let schema = r#"
DEFINE TABLE user SCHEMALESS;
DEFINE TABLE article SCHEMALESS;
DEFINE TABLE likes SCHEMALESS;
"#;
ds.execute(schema, &ses, None).await?;
// 3. 创建测试数据
let users = r#"
CREATE user:john SET name = 'John Doe', age = 32, interests = ['Rust', 'Database'];
CREATE user:jane SET name = 'Jane Smith', age = 28, interests = ['Rust', 'Web'];
"#;
ds.execute(users, &ses, None).await?;
let articles = r#"
CREATE article:rust1 SET
title = 'Getting Started with SurrealDB',
content = 'SurrealDB is a multi-model database...',
tags = ['database', 'rust'];
CREATE article:rust2 SET
title = 'Advanced Rust Techniques',
content = 'Learn advanced Rust programming...',
tags = ['programming', 'rust'];
"#;
ds.execute(articles, &ses, None).await?;
// 4. 建立关系数据
let relations = r#"
RELATE user:john->likes->article:rust1 SET score = 5;
RELATE user:jane->likes->article:rust2 SET score = 4;
"#;
ds.execute(relations, &ses, None).await?;
// 5. 复杂查询示例
// 查询喜欢Rust文章的用户
let query = r#"
SELECT <-likes<-user.name AS liker, ->likes->article.title AS article
FROM article
WHERE tags CONTAINS 'rust'
"#;
let res = ds.execute(query, &ses, None).await?;
println!("喜欢Rust文章的用户: {:?}", res);
// 6. 实时数据订阅
tokio::spawn(async move {
let sql = "LIVE SELECT * FROM article";
let mut stream = ds.execute(sql, &ses, None).await.unwrap().stream().unwrap();
while let Some(res) = stream.next().await {
match res {
Ok(data) => println!("实时文章更新: {:?}", data),
Err(e) => eprintln!("订阅错误: {}", e),
}
}
});
// 7. 模拟数据变更
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
let update = "UPDATE article:rust1 SET views = 100";
ds.execute(update, &ses, None).await?;
Ok(())
}
存储引擎选项
# 使用内存存储(开发用)
surrealdb-core-nightly = { version = "0.1.0", features = ["kv-mem"] }
# 使用文件存储
surrealdb-core-nightly = { version = "0.1.0", features = ["kv-rocksdb"] }
# 使用TiKV分布式存储
surrealdb-core-nightly = { version = "0.1.0", features = ["kv-tikv"] }
注意事项
nightly
版本可能包含不稳定API,生产环境建议使用稳定版本- 需要Rust nightly工具链
- 完整功能可能需要启用额外的feature flag
SurrealDB Core为Rust应用提供了强大的嵌入式数据库解决方案,特别适合需要混合数据模型和实时功能的场景。