الانتقال إلى المحتوى الرئيسي
يوفّر 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 من ترويسات C
  • 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.
آخر تعديل في ٢٩ يونيو ٢٠٢٦