20 个版本
1.1.0-alpha.1 | 2023 年 9 月 10 日 |
---|---|
1.0.0-alpha.1 | 2021 年 1 月 27 日 |
0.2.0-alpha.5 | 2020 年 6 月 9 日 |
0.2.0-alpha.4 | 2020 年 1 月 24 日 |
0.1.0 |
|
#81 在 数据库接口
3,750 每月下载
在 8 个 Crates 中使用 (7 直接)
470KB
13K SLoC
异步 ClickHouse 客户端
为 Rust 编程语言提供的异步 Yandex ClickHouse 客户端库。
安装
库托管在 crates.io。
[dependencies]
clickhouse-rs = "*"
支持的数据类型
- 日期
- 日期时间
- 十进制(P, S)
- Float32, Float64
- 字符串, 固定字符串(N)
- UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64
- Nullable(T)
- Array(UInt/Int/Float/String/Date/DateTime)
- SimpleAggregateFunction(F, T)
- IPv4/IPv6
- UUID
- 布尔
DNS
schema://user:password@host[:port]/database?param1=value1&...¶mN=valueN
参数
-
compression
- 是否使用压缩(默认为none
)。可能的选项none
lz4
-
connection_timeout
- 连接超时(默认为500 ms
) -
query_timeout
- 查询超时(默认为180 sec
)。 -
insert_timeout
- 插入超时(默认为180 sec
)。 -
execute_timeout
- 执行超时(默认为180 sec
)。 -
keepalive
- 毫秒级的 TCP keep alive 超时。 -
nodelay
- 是否启用TCP_NODELAY
(默认为true
)。 -
pool_min
-Pool
打开连接的下限(默认为10
)。 -
pool_max
-Pool
打开连接的上限(默认为20
)。 -
ping_before_query
- 在执行任何查询之前每次都ping服务器。(默认为true
)。 -
send_retries
- 向服务器发送请求的重试次数。(默认为3
)。 -
retry_timeout
- 下次重试前等待的时间。(默认为5 sec
)。 -
ping_timeout
- ping 的超时(默认为500 ms
)。 -
alt_hosts
- 以逗号分隔的单个地址主机列表,用于负载均衡。
示例
tcp://user:password@host:9000/clicks?compression=lz4&ping_timeout=42ms
可选功能
clickhouse-rs
将一些功能放在可选功能之后,以优化最常见用例的编译时间。以下功能可用。
tokio_io
(默认启用) — 基于 Tokio 的 I/O。async_std
— 基于 async-std 的 I/O(不能与tokio_io
同时使用)。tls
— TLS 支持(仅允许与tokio_io
一起使用)。
示例
use clickhouse_rs::{Block, Pool};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let ddl = r"
CREATE TABLE IF NOT EXISTS payment (
customer_id UInt32,
amount UInt32,
account_name Nullable(FixedString(3))
) Engine=Memory";
let block = Block::new()
.column("customer_id", vec![1_u32, 3, 5, 7, 9])
.column("amount", vec![2_u32, 4, 6, 8, 10])
.column("account_name", vec![Some("foo"), None, None, None, Some("bar")]);
let pool = Pool::new(database_url);
let mut client = pool.get_handle().await?;
client.execute(ddl).await?;
client.insert("payment", block).await?;
let block = client.query("SELECT * FROM payment").fetch_all().await?;
for row in block.rows() {
let id: u32 = row.get("customer_id")?;
let amount: u32 = row.get("amount")?;
let name: Option<&str> = row.get("account_name")?;
println!("Found payment {}: {} {:?}", id, amount, name);
}
Ok(())
}
依赖项
~6–19MB
~282K SLoC