Rust Cassandra数据库驱动cassandra-cpp的使用:高性能C++绑定与数据存储解决方案

Rust Cassandra数据库驱动cassandra-cpp的使用:高性能C++绑定与数据存储解决方案

这是一个维护良好的Rust项目,它暴露了DataStax C++驱动程序的接口,并提供了相对合理的封装。该项目最初是从cassandra-rs分叉而来,但原项目已不再维护。

入门指南

本地环境配置

要使用这个crate,您需要先安装足够新版本的DataStax C++驱动程序(至少2.16版)。请按照C++驱动程序文档中的步骤进行操作。大多数平台都提供预构建的包。

确保驱动程序(特别是libcassandra_static.alibcassandra.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(以及PreparedStatementBatch)现在与特定的Session相关联。

特性标志

这个crate包含特性标志early_access_min_tls_version,它允许您构建支持cass_ssl_set_min_protocol_version方法的DataStax驱动程序版本。

许可证

此代码是开源的,根据Apache License Version 2.0许可。


1 回复

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

示例说明

  1. 首先创建Cluster对象并配置连接参数
  2. 连接到Cassandra集群并创建Session
  3. 创建keyspace和表结构(如果不存在)
  4. 使用预编译语句插入单条数据
  5. 使用批量操作插入多条数据
  6. 查询并打印所有用户数据
  7. 更新特定用户的邮箱
  8. 删除指定ID的用户

这个示例展示了cassandra-cpp驱动的基本CRUD操作,包括连接管理、数据插入、查询、更新和删除等常见操作。

回到顶部