前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >介绍一款还不错的Rust ClickHouse客户端

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

作者头像
Nauu
发布2021-08-25 15:35:32
1.9K0
发布2021-08-25 15:35:32
举报

用过 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 的版本:

代码语言:javascript
复制
rustup install nightly
rustup default nightly

建立连接:

代码语言:javascript
复制
let client = Client::default()
    .with_url("http://ch9.nauu.com:8123")
    .with_user("default")
    .with_password("123")
    .with_database("test");

快速建立连接:

代码语言:javascript
复制
let client = Client::default().with_url("http://ch9.nauu.com:8123");

数据实体映射:

代码语言:javascript
复制
#[derive(Debug, Row, Serialize, Deserialize)]
struct Payment<'a> {
    no: u32,
    name: &'a str,
}

ddl:

代码语言:javascript
复制
client.query("DROP TABLE IF EXISTS payment").execute().await?;
代码语言:javascript
复制
 client.query(
            "
            CREATE TABLE payment(no UInt32, name LowCardinality(String))
            ENGINE = MergeTree
            ORDER BY no
        ",
        ).execute().await

批量写入:

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

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

按阈值,批量写入:

代码语言:javascript
复制
 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 写入。

查询:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ClickHouse的秘密基地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档