Rust数据库插件库surrealdb-nightly的使用:高性能NoSQL与SQL混合数据库解决方案

根据您的要求,我将直接输出您提供的内容中的示例和完整示例代码:

Rust使用示例

use surrealdb::engine::remote::ws::{Client, Ws};
use surrealdb::opt::auth::Root;
use surrealdb::sql::thing;
use surrealdb::Surreal;

#[tokio::main]
async fn main() -> surrealdb::Result<()> {
    // 连接到SurrealDB服务器
    let db = Surreal::new::<Ws>("127.0.0.1:8000").await?;
    
    // 登录到数据库
    db.signin(Root {
        username: "root",
        password: "root",
    })
    .await?;
    
    // 选择命名空间和数据库
    db.use_ns("test").use_db("test").await?;
    
    // 创建一个新用户记录
    #[derive(Debug, serde::Serialize, serde::Deserialize)]
    struct User {
        name: String,
        email: String,
    }
    
    let user = User {
        name: "John Doe".to_string(),
        email: "john@example.com".to_string(),
    };
    
    // 插入用户数据
    let created: Vec<User> = db.create("user").content(user).await?;
    println!("Created user: {:?}", created);
    
    // 查询用户数据
    let users: Vec<User> = db.select("user").await?;
    println!("All users: {:?}", users);
    
    // 更新用户数据
    let updated: Option<User> = db.update(("user", "john"))
        .merge(User {
            name: "John Smith".to_string(),
            email: "john.smith@example.com".to_string(),
        })
        .await?;
    println!("Updated user: {:?}", updated);
    
    Ok(())
}

完整示例代码

use surrealdb::engine::remote::ws::{Client, Ws};
use surrealdb::opt::auth::Root;
use surrealdb::sql::thing;
use surrealdb::Surreal;
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
struct User {
    name: String,
    email: String,
    age: u8,
}

#[derive(Debug, Serialize, Deserialize)]
struct Post {
    title: String,
    content: String,
    author: String, // 关联用户ID
}

#[tokio::main]
async fn main() -> surrealdb::Result<()> {
    // 1. 连接到SurrealDB服务器
    let db = Surreal::new::<Ws>("127.0.0.1:8000").await?;
    
    // 2. 登录到数据库
    db.signin(Root {
        username: "root",
        password: "root",
    })
    .await?;
    
    // 3. 选择命名空间和数据库
    db.use_ns("blog").use_db("production").await?;
    
    // 4. 创建用户
    let user = User {
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
        age: 28,
    };
    
    let created_user: Vec<User> = db.create("user").content(user).await?;
    println!("Created user: {:?}", created_user);
    
    // 5. 创建关联文章
    let post = Post {
        title: "My first post".to_string(),
        content: "This is the content of my first post".to_string(),
        author: created_user[0].name.clone(),
    };
    
    let created_post: Vec[Post] = db.create("post").content(post).await?;
    println!("Created post: {:?}", created_post);
    
    // 6. 使用SQL查询
    let mut response = db
        .query("SELECT * FROM post WHERE author = $author")
        .bind(("author", "Alice"))
        .await?;
    
    let posts: Vec<Post> = response.take(0)?;
    println!("Posts by Alice: {:?}", posts);
    
    // 7. 更新用户年龄
    let updated: Option<User> = db.update(("user", "alice"))
        .merge(json!({ "age": 29 }))
        .await?;
    println!("Updated user: {:?}", updated);
    
    // 8. 删除测试数据
    db.delete(("user", "alice")).await?;
    db.delete(("post", "my_first_post")).await?;
    
    Ok(())
}

1 回复

Rust数据库插件库surrealdb-nightly使用指南

概述

SurrealDB是一个新兴的高性能混合数据库,结合了NoSQL的灵活性和SQL的强大查询能力。surrealdb-nightly是Rust语言的插件库,提供了对SurrealDB的完整访问支持。

主要特性

  • 支持文档存储和图数据库模型
  • 提供SQL风格的查询语言
  • 嵌入式数据库和客户端/服务器模式
  • 实时数据同步功能
  • 支持多种数据格式(JSON等)

安装方法

在Cargo.toml中添加依赖:

[dependencies]
surrealdb-nightly = { version = "1.0.0-nightly", features = ["kv-mem"] }

基本使用方法

1. 连接数据库

use surrealdb::engine::local::Mem;
use surrealdb::Surreal;

#[tokio::main]
async fn main() -> surrealdb::Result<()> {
    // 创建内存数据库实例
    let db = Surreal::new::<Mem>(()).await?;
    
    // 选择命名空间和数据库
    db.use_ns("test").use_db("test").await?;
    
    Ok(())
}

2. 创建记录

// 创建用户记录
let created: Vec<Record> = db
    .create("user")
    .content(User {
        name: "John Doe",
        age: 32,
        active: true,
    })
    .await?;

3. 查询数据

// SQL风格查询
let mut response = db
    .query("SELECT * FROM user WHERE age > $age")
    .bind(("age", 30))
    .await?;

// 获取结果
let users: Vec<User> = response.take(0)?;

4. 更新数据

// 更新用户信息
let updated: Option<User> = db
    .update(("user", "john"))
    .merge(json!({ "age": 33 }))
    .await?;

5. 实时订阅

// 创建实时订阅
let mut stream = db
    .select("user")
    .live()
    .await?;

// 处理实时更新
while let Some(result) = stream.next().await {
    match result {
        Ok(notification) => println!("{:?}", notification),
        Err(error) => eprintln!("{}", error),
    }
}

高级功能示例

关联查询(图数据库功能)

let response = db
    .query("
        SELECT * FROM user WHERE ->knows->user.age > 30
    ")
    .await?;

事务处理

db.transaction(|tx| {
    Box::pin(async move {
        tx.query("CREATE user:john SET name = 'John'").await?;
        tx.query("CREATE user:jane SET name = 'Jane'").await?;
        Ok(())
    })
}).await?;

完整示例代码

use serde::{Deserialize, Serialize};
use surrealdb::engine::local::Mem;
use surrealdb::sql::thing;
use surrealdb::Surreal;

// 定义用户结构体
#[derive(Debug, Serialize, Deserialize)]
struct User {
    name: String,
    age: u8,
    active: bool,
}

#[tokio::main]
async fn main() -> surrealdb::Result<()> {
    // 1. 连接数据库
    let db = Surreal::new::<Mem>(()).await?;
    db.use_ns("test").use_db("test").await?;

    // 2. 创建记录
    let created: Vec<surrealdb::sql::Value> = db
        .create("user")
        .content(User {
            name: "John Doe".into(),
            age: 32,
            active: true,
        })
        .await?;
    println!("创建记录: {:?}", created);

    // 3. 查询数据
    let mut response = db
        .query("SELECT * FROM user WHERE age > $age")
        .bind(("age", 30))
        .await?;
    let users: Vec<User> = response.take(0)?;
    println!("查询结果: {:?}", users);

    // 4. 更新数据
    if let Some(user_id) = created[0].as_object().unwrap().get("id") {
        let updated: Option<User> = db
            .update(thing(user_id.to_string())?)
            .merge(serde_json::json!({ "age": 33 }))
            .await?;
        println!("更新结果: {:?}", updated);
    }

    // 5. 实时订阅
    let mut stream = db.select("user").live().await?;
    tokio::spawn(async move {
        while let Some(result) = stream.next().await {
            match result {
                Ok(notification) => println!("实时更新: {:?}", notification),
                Err(error) => eprintln!("错误: {}", error),
            }
        }
    });

    // 高级功能示例
    // 关联查询
    let relation_response = db
        .query("SELECT * FROM user WHERE ->knows->user.age > 30")
        .await?;
    println!("关联查询结果: {:?}", relation_response);

    // 事务处理
    db.transaction(|tx| {
        Box::pin(async move {
            tx.query("CREATE user:john SET name = 'John'").await?;
            tx.query("CREATE user:jane SET name = 'Jane'").await?;
            Ok(())
        })
    })
    .await?;

    Ok(())
}

性能提示

  1. 对于批量操作,使用BEGIN TRANSACTIONCOMMIT TRANSACTION
  2. 合理使用索引
  3. 考虑使用嵌入式模式减少网络开销

注意事项

  • surrealdb-nightly是每日构建版本,API可能不稳定
  • 生产环境建议使用稳定版本
  • 内存数据库重启后数据会丢失,持久化存储需要配置相应引擎
回到顶部