Rust Cassandra数据库驱动cassandra-cpp的使用:高性能C++绑定与数据存储解决方案
Rust Cassandra数据库驱动cassandra-cpp的使用:高性能C++绑定与数据存储解决方案
这是一个维护良好的Rust项目,它暴露了DataStax C++驱动程序的接口,并提供了相对合理的封装。该项目最初是从cassandra-rs分叉而来,但原项目已不再维护。
入门指南
本地环境配置
要使用这个crate,您需要先安装足够新版本的DataStax C++驱动程序(至少2.16版)。请按照C++驱动程序文档中的步骤进行操作。大多数平台都提供预构建的包。
确保驱动程序(特别是libcassandra_static.a
和libcassandra.so
)位于您的/usr/local/lib64/
目录中
使用Floki
或者,您可以使用Floki工具创建一个Docker化的编译环境。安装Floki后,只需在此项目的根目录中键入:
floki
您将进入一个Rust编译环境;像往常一样输入cargo build
来构建驱动程序。
示例
内容中提供的简单示例:
for row in result {
// ... do something with row ...
}
需要改为(3.0版本后):
let mut iter = result.iter();
while let Some(row) = iter.next() {
// ... do something with row ...
}
完整示例代码
下面是一个完整的Rust使用Cassandra数据库的示例:
use cassandra_cpp::*;
#[tokio::main]
async fn main() -> Result<()> {
// 创建集群连接
let cluster = Cluster::default()
.set_contact_points("127.0.0.1")? // 设置Cassandra节点地址
.set_load_balance_round_robin()?; // 设置负载均衡策略
// 连接到集群
let session = cluster.connect().await?;
// 创建Keyspace
session.execute(
"CREATE KEYSPACE IF NOT EXISTS example WITH replication = { \
'class': 'SimpleStrategy', 'replication_factor': '1' };"
).await?;
// 使用Keyspace
session.execute("USE example").await?;
// 创建表
session.execute(
"CREATE TABLE IF NOT EXISTS users ( \
user_id uuid PRIMARY KEY, \
name text, \
email text, \
age int);"
).await?;
// 准备插入语句
let insert_stmt = session.statement(
"INSERT INTO users (user_id, name, email, age) VALUES (?, ?, ?, ?);"
);
// 生成UUID
let user_id = Uuid::now();
// 绑定参数并执行
insert_stmt.bind(0, user_id)?
.bind(1, "John Doe")?
.bind(2, "john@example.com")?
.bind(3, 30)?;
session.execute(&insert_stmt).await?;
// 查询数据
let select_stmt = session.statement(
"SELECT user_id, name, email, age FROM users WHERE user_id = ?;"
).bind(0, user_id)?;
let result = session.execute(&select_stmt).await?;
// 处理结果
let mut iter = result.iter();
while let Some(row) = iter.next() {
let name: String = row.get_by_name("name")?;
let email: String = row.get_by_name("email")?;
let age: i32 = row.get_by_name("age")?;
println!("User: {}, Email: {}, Age: {}", name, email, age);
}
Ok(())
}
版本变化
3.0版本的迭代器API
3.0版本修复了之前API中的安全性问题。基础Cassandra驱动程序中的迭代器在调用next()
时会使当前项无效,这在3.0之前的Rust绑定中没有体现。
2.0版本的新会话API
2.0版本引入了一个新的更安全的API。Statement
(以及PreparedStatement
和Batch
)现在与特定的Session
相关联。
特性标志
这个crate包含特性标志early_access_min_tls_version
,它允许您构建支持cass_ssl_set_min_protocol_version
方法的DataStax驱动程序版本。
许可证
此代码是开源的,根据Apache License Version 2.0许可。
Rust Cassandra数据库驱动cassandra-cpp的使用指南
以下是cassandra-cpp驱动的基本使用示例:
1. 连接到Cassandra集群
use cassandra_cpp::*;
fn main() -> Result<(), CassError> {
// 创建集群对象并配置
let cluster = Cluster::default();
cluster.set_contact_points("127.0.0.1")?;
// 连接到集群
let session = cluster.connect()?;
// 执行简单查询
let result = session.execute("SELECT keyspace_name FROM system_schema.keyspaces;")?;
// 处理结果
for row in result.iter() {
let keyspace_name: String = row.get_by_name("keyspace_name")?;
println!("Keyspace: {}", keyspace_name);
}
Ok(())
}
2. 使用预编译语句
use cassandra_cpp::*;
fn insert_data(session: &Session) -> Result<(), CassError> {
// 准备预编译语句
let query = "INSERT INTO example.users (id, name, email) VALUES (?, ?, ?)";
let statement = session.statement(query);
// 绑定参数并执行
statement.bind(0, 1)?; // id
statement.bind(1, "John Doe")?; // name
statement.bind(2, "john@example.com")?; // email
session.execute(&statement).wait()?;
Ok(())
}
完整示例代码
下面是一个完整的Cassandra CRUD操作示例:
use cassandra_cpp::*;
use futures::executor::block_on;
async fn cassandra_example() -> Result<(), CassError> {
// 1. 创建集群连接
let cluster = Cluster::default();
cluster.set_contact_points("127.0.0.1")?;
cluster.set_num_threads_io(4)?;
let session = cluster.connect()?;
// 2. 创建keyspace和表
session.execute(
"CREATE KEYSPACE IF NOT EXISTS example WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': '1'
}"
).wait()?;
session.execute(
"CREATE TABLE IF NOT EXISTS example.users (
id int PRIMARY KEY,
name text,
email text
)"
).wait()?;
// 3. 插入数据
let insert_query = "INSERT INTO example.users (id, name, email) VALUES (?, ?, ?)";
let mut statement = session.statement(insert_query);
statement.bind(0, 1)?;
statement.bind(1, "Alice")?;
statement.bind(2, "alice@example.com")?;
session.execute(&statement).wait()?;
// 4. 批量插入
let mut batch = Batch::new(BatchType::LOGGED);
for i in 2..=5 {
let mut stmt = session.statement(insert_query);
stmt.bind(0, i)?;
stmt.bind(1, format!("User {}", i))?;
stmt.bind(2, format!("user{}@example.com", i))?;
batch.add_statement(&stmt)?;
}
session.execute_batch(&batch).wait()?;
// 5. 查询数据
let result = session.execute("SELECT * FROM example.users").wait()?;
for row in result.iter() {
let id: i32 = row.get(0)?;
let name: String = row.get(1)?;
let email: String = row.get(2)?;
println!("ID: {}, Name: {}, Email: {}", id, name, email);
}
// 6. 更新数据
let update_query = "UPDATE example.users SET email = ? WHERE id = ?";
let mut update_stmt = session.statement(update_query);
update_stmt.bind(0, "new.alice@example.com")?;
update_stmt.bind(1, 1)?;
session.execute(&update_stmt).wait()?;
// 7. 删除数据
let delete_query = "DELETE FROM example.users WHERE id = ?";
let mut delete_stmt = session.statement(delete_query);
delete_stmt.bind(0, 5)?;
session.execute(&delete_stmt).wait()?;
Ok(())
}
fn main() -> Result<(), CassError> {
block_on(cassandra_example())
}
示例说明
- 首先创建Cluster对象并配置连接参数
- 连接到Cassandra集群并创建Session
- 创建keyspace和表结构(如果不存在)
- 使用预编译语句插入单条数据
- 使用批量操作插入多条数据
- 查询并打印所有用户数据
- 更新特定用户的邮箱
- 删除指定ID的用户
这个示例展示了cassandra-cpp驱动的基本CRUD操作,包括连接管理、数据插入、查询、更新和删除等常见操作。