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(())
}

特性说明

  1. 嵌入式数据库:可以直接在内存中运行,无需额外服务器
  2. NoSQL支持:支持JSON风格的文档插入和查询
  3. SQL支持:支持传统SQL查询语法
  4. 混合查询:可以在SQL查询中嵌入NoSQL风格的文档操作

注意事项

  1. 此crate是SurrealDB内部核心库,不建议在生产环境中直接使用
  2. 如需稳定API,请使用官方Rust SDK
  3. 此示例仅展示基本功能,实际使用中可能需要更多配置和错误处理

文档与支持

此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"] }

注意事项

  1. nightly版本可能包含不稳定API,生产环境建议使用稳定版本
  2. 需要Rust nightly工具链
  3. 完整功能可能需要启用额外的feature flag

SurrealDB Core为Rust应用提供了强大的嵌入式数据库解决方案,特别适合需要混合数据模型和实时功能的场景。

回到顶部