You need to enable JavaScript to run this app.
导航
ClickHouse Rust (HTTP) Driver
最近更新时间:2025.03.12 14:06:07首次发布时间:2025.03.12 14:06:07
我的收藏
有用
有用
无用
无用

本文介绍如何使用 ClickHouse Rust (HTTP) 驱动连接并访问 ByteHouse 云数仓。

注意事项

细分项

已验证版本/注意事项

ClickHouse驱动程序版本

已验证版本:0.13.1,版本详情请参见:clickhouse v0.13.1

Rustc版本

已验证版本:Rustc1.84.1

安装驱动

获取ClickHouse驱动后,可以通过cargo进行安装:

# Install ClickHouse with native-tls feature
cargo add clickhouse@0.13.1 --features native-tls
# Install tokio with full features (required for async operations)
cargo add tokio@1.0.1 --features full
# Install anyhow for error handling (optional but recommended)
cargo add anyhow
# Install serde with derive features (required for Row trait)
cargo add serde --features derive

或者将以下内容添加到Cargo. toml

[dependencies]
anyhow = "1.0.95"
clickhouse = { version = "0.13.1", features = ["native-tls"] }
serde = { version = "1.0.217", features = ["derive"] }
tokio = { version = "1.0.1", features = ["full"] }

连接ByteHouse

可参考下面代码样例,通过Rust驱动连接ByteHouse。

use clickhouse::Client;
use anyhow::Result;

pub async fn create_client() -> Result<()> {
    // Create a client
    let client = Client::default()
        .with_url("https://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:8123")
        .with_database("your_database")
        .with_user("bytehouse")
        .with_password("your_api_key");
        .with_option("virtual_warehouse", "your_vw_id");

    // Test connection with a simple query
    let result: u8 = client
        .query("SELECT 1")
        .fetch_one()
        .await?;

    println!("Query result: {}", result);

    Ok(())
}

参数

配置要点

url

  • 连接ByteHouse时,URL需为HTTPS。
  • URL信息可参考ByteHouse的公网连接域名,其中{TENANT_ID}、{REGION}分别为火山引擎主账号的账号ID和ByteHouse的地域信息,您可以在ByteHouse控制台的 租户管理>基本信息>网络信息 中查看对应信息。

database

配置为连接ByteHouse的数据库名称。

user & password

  • user:固定配置为bytehouse
  • password:为ByteHouse的<API_Key>,您可以在ByteHouse控制台的 租户管理>连接信息 中获取API Key。

option(可选参数)

(可选)配置连接ByteHouse后使用的计算组。如果您有多个计算组,希望后续查询ByteHouse数据时使用指定计算组,或者希望设置其他指定参数,您可以在option中进行设置。

使用示例

连接ByteHouse后,您可以通过ClickHouse Rust (HTTP) Driver进行建表、数据读写等操作,以下为简单的操作示例。

示例1:建表、数据读写

use clickhouse::Row;
use serde::{Deserialize, Serialize};
use anyhow::Result;
use crate::utils::create_client;

#[derive(Debug, Row, Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
    age: u8,
    active: bool,
}

pub async fn quickstart_example() -> Result<()> {
    let client = create_client();

    // Drop table if exists and create a new one
    client
        .query("DROP TABLE IF EXISTS users")
        .execute()
        .await?;

    client
        .query(
            "
            CREATE TABLE users (
                id       UInt32,
                name     String,
                age      UInt8,
                active   Bool
            ) ENGINE = CnchMergeTree()
            ORDER BY id
            "
        )
        .execute()
        .await?;

    println!("Table created successfully");

    // Insert some sample data
    let mut insert = client.insert("users")?;

    let users = vec![
        User {
            id: 1,
            name: "Alice".to_string(),
            age: 25,
            active: true,
        },
        User {
            id: 2,
            name: "Bob".to_string(),
            age: 30,
            active: true,
        },
        User {
            id: 3,
            name: "Charlie".to_string(),
            age: 35,
            active: false,
        },
    ];

    for user in users {
        insert.write(&user).await?;
    }

    insert.end().await?;
    println!("Data inserted successfully");

    // Select all users
    let all_users = client
        .query("SELECT ?fields FROM users")
        .fetch_all::<User>()
        .await?;

    println!("\nAll users:");
    for user in all_users {
        println!("{:?}", user);
    }

    Ok(())
}

示例2:传递Query ID

您也可以在连接ByteHouse时设置将Query ID传递给客户端。

use anyhow::Result;
use crate::utils::create_client;

pub async fn query_id_example() -> Result<()> {
    let client = create_client();

    // Use a simple string as query ID
    let query_id = "test_query_id_1";

    // Execute a simple query with the query ID
    let result = client
        .query("SELECT 1")
        .with_option("query_id", query_id)
        .fetch_one::<u8>()
        .await?;

    println!("Query ID: {}", query_id);
    println!("Result: {}", result);

    Ok(())
}