يوفّر chDB-rust واجهات ربط FFI (واجهة الوظائف الأجنبية) تجريبية لـ chDB، مما يتيح لك تشغيل استعلامات ClickHouse مباشرةً في تطبيقات Rust من دون أي تبعيات خارجية.
التثبيت
تثبيت 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>> {
// Execute a simple query
let result = execute(
"SELECT version()",
Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)])
)?;
println!("ClickHouse version: {}", result.data_utf8()?);
// Query with CSV file
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>> {
// Create a temporary directory for database storage
let tmp = TempDir::new("chdb-rust")?;
// Build session with configuration
let session = SessionBuilder::new()
.with_data_path(tmp.path())
.with_arg(Arg::LogLevel(LogLevel::Debug))
.with_auto_cleanup(true) // Cleanup on drop
.build()?;
// Create database and table
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,
)?;
// Insert data
session.execute(
"INSERT INTO logs (id, msg) VALUES (1, 'Hello'), (2, 'World')",
None,
)?;
// Query data
let result = session.execute(
"SELECT * FROM logs ORDER BY id",
Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)]),
)?;
println!("Query results:\n{}", result.data_utf8()?);
// Get query statistics
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) - توليد واجهات ربط FFI من ترويسات Ctempdir(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.