用过 Rust 的应该都知道,tokio 是异步编程的基石,很多框架都是基于 tokio 之上构建的。目前一些 ClickHouse 的客户端代码比较陈旧,使用的 tokio 版本很低 (0.x)。
tokio 1.x 和 0.x 又存在兼容性问题,由于依赖的传递性,会导致项目中多个第三方开源框架 tokio 版本存在打架的问题。
今天就介绍一款代码比较新的 Rust ClickHouse 客户端,叫做 clickhouse.rs,它有几个比较突出的特点:
接下里就简单看看使用它的观感,文末会放上 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的秘密基地 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!