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(())
}
性能提示
- 对于批量操作,使用
BEGIN TRANSACTION
和COMMIT TRANSACTION
- 合理使用索引
- 考虑使用嵌入式模式减少网络开销
注意事项
- surrealdb-nightly是每日构建版本,API可能不稳定
- 生产环境建议使用稳定版本
- 内存数据库重启后数据会丢失,持久化存储需要配置相应引擎