chDB-rust は、chDB 向けの Experimental な FFI (Foreign Function Interface) バインディングを提供しており、外部依存関係なしで Rust アプリケーションから ClickHouse クエリを直接実行できます。
インストール
libchdb をインストールする
chDB ライブラリをインストールします。
curl -sL https://lib.chdb.io | bash使用方法
chDB Rust では、ステートレスとステートフルの両方のクエリ実行モードを利用できます。
ステートレスな使用
永続的な状態を伴わないシンプルなクエリの場合:
use chdb_rust::{execute, arg::Arg, format::OutputFormat};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// シンプルなクエリを実行する
let result = execute(
"SELECT version()",
Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)])
)?;
println!("ClickHouse version: {}", result.data_utf8()?);
// CSV ファイルを使ったクエリ
let result = execute(
"SELECT * FROM file('data.csv', 'CSV')",
Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)])
)?;
println!("CSV data: {}", result.data_utf8()?);
Ok(())
}ステートフルな利用 (セッション)
データベースやテーブルなどの永続的な状態を必要とするクエリの場合:
use chdb_rust::{
session::SessionBuilder,
arg::Arg,
format::OutputFormat,
log_level::LogLevel
};
use tempdir::TempDir;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// データベースストレージ用の一時ディレクトリを作成する
let tmp = TempDir::new("chdb-rust")?;
// 設定を指定してセッションを構築する
let session = SessionBuilder::new()
.with_data_path(tmp.path())
.with_arg(Arg::LogLevel(LogLevel::Debug))
.with_auto_cleanup(true) // drop時にクリーンアップ
.build()?;
// データベースとテーブルを作成する
session.execute(
"CREATE DATABASE demo; USE demo",
Some(&[Arg::MultiQuery])
)?;
session.execute(
"CREATE TABLE logs (id UInt64, msg String) ENGINE = MergeTree() ORDER BY id",
None,
)?;
// データを挿入する
session.execute(
"INSERT INTO logs (id, msg) VALUES (1, 'Hello'), (2, 'World')",
None,
)?;
// データをクエリする
let result = session.execute(
"SELECT * FROM logs ORDER BY id",
Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)]),
)?;
println!("Query results:\n{}", result.data_utf8()?);
// クエリの統計情報を取得する
println!("Rows read: {}", result.rows_read());
println!("Bytes read: {}", result.bytes_read());
println!("Query time: {:?}", result.elapsed());
Ok(())
}ビルドとテスト
プロジェクトをビルドする
cargo buildテストの実行
cargo test開発用依存関係
このプロジェクトには、次の開発用依存関係が含まれています。
bindgen(v0.70.1) - C ヘッダーから FFI バインディングを生成tempdir(v0.3.7) - テストでの一時ディレクトリの処理thiserror(v1) - エラー処理ユーティリティ
エラー処理
chDB Rust は、Error 列挙型を通じて包括的なエラー処理を提供します。
use chdb_rust::{execute, error::Error};
match execute("SELECT 1", None) {
Ok(result) => {
println!("Success: {}", result.data_utf8()?);
},
Err(Error::QueryError(msg)) => {
eprintln!("Query failed: {}", msg);
},
Err(Error::NoResult) => {
eprintln!("No result returned");
},
Err(Error::NonUtf8Sequence(e)) => {
eprintln!("Invalid UTF-8: {}", e);
},
Err(e) => {
eprintln!("Other error: {}", e);
}
}GitHub リポジトリ
このプロジェクトの GitHub リポジトリは chdb-io/chdb-rust で公開されています。