介绍一款还不错的Rust ClickHouse客户端

用过 Rust 的应该都知道,tokio 是异步编程的基石,很多框架都是基于 tokio 之上构建的。目前一些 ClickHouse 的客户端代码比较陈旧,使用的 tokio 版本很低 (0.x)。


tokio 1.x 和 0.x 又存在兼容性问题,由于依赖的传递性,会导致项目中多个第三方开源框架 tokio 版本存在打架的问题。

今天就介绍一款代码比较新的 Rust ClickHouse 客户端,叫做 clickhouse.rs,它有几个比较突出的特点:

  • 基于 tokio 1.x

  • 支持数据对象映射

  • 提供了批处理写入的 API

  • 提供了支持 Live View 的 API

接下里就简单看看使用它的观感,文末会放上 github 地址。

clickhouse.rs 目前要使用 Rust nightly 的版本:

rustup install nightly
rustup default nightly

建立连接:

let client = Client::default()
    .with_url("http://ch9.nauu.com:8123")
    .with_user("default")
    .with_password("123")
    .with_database("test");

快速建立连接:

let client = Client::default().with_url("http://ch9.nauu.com:8123");

数据实体映射:

#[derive(Debug, Row, Serialize, Deserialize)]
struct Payment<'a> {
    no: u32,
    name: &'a str,
}

ddl:

client.query("DROP TABLE IF EXISTS payment").execute().await?;
 client.query(
            "
            CREATE TABLE payment(no UInt32, name LowCardinality(String))
            ENGINE = MergeTree
            ORDER BY no
        ",
        ).execute().await

批量写入:

    let mut insert = client.insert("payment")?;
    for i in 0..1000 {
        insert.write(&MyRow { no: i, name: "foo" }).await?;
    }
    insert.end().await

如果 end 没有被调用,写入将会被终止。

按阈值,批量写入:

 let mut inserter = client
        .inserter("payment")?
        .with_max_entries(100_000)
        .with_max_duration(Duration::from_secs(15));


    for i in 0..1000 {


        inserter.write(&Payment { no: i, name: "foo" }).await?;
        inserter.commit().await?;
    }


    inserter.end().await?;

当调用 commit 的时候,如果阈值满足了max_entries 或者 max_duration ,就会触发一次 INSERT 写入。

查询:

let mut cursor = client
        .query("SELECT ?fields FROM payment WHERE no BETWEEN ? AND ?")
        .bind(71)
        .bind(33)
        .fetch::<Payment<'_>>()?;


    while let Some(row) = cursor.next().await? {
        println!("{:?}", row);
    }

其中,?fields 可以由 Payment 的字段自动填充;

Where 条件的 ? 占位符可以由 bind 填充。

Live View:

let mut cursor = client
    .watch("SELECT max(no), argMax(name, no) FROM payment")
    .fetch::<Payment<'_>>()?;


let (version, row) = cursor.next().await?.unwrap();
println!("live view : version={}, row={:?}", version, row);

clickhouse.rs 也内置了对 Live View 的监听。

好了,今天的分享就到这里吧,clickhouse.rs 的地址如下:

https://github.com/loyd/clickhouse.rs

作者简介:

朱凯,ClickHouse贡献者之一,ClickHouse布道者,资深架构师,腾讯云最具价值专家TVP,开源爱好者,Apache DolphinScheduler Committer,《企业级大数据平台构建:架构与实现》《ClickHouse原理解析与应用实战》作者,公众号“ClickHouse的秘密基地”运营者。


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 8月书讯(上)| 这些新书不可错过

书讯 | 8月书讯(下)| 这些新书不可错过

资讯 | Rust跨界前端全攻略

书单 | 2021半年盘点,不想你错过的重磅新书

干货 | Rust跨界前端全攻略

收藏 | 快收藏!!整理了100个Python小技巧!!

上新 | 【新书速递】深入浅出Pandas,用好Python必备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值