2 stable releases

new 2.0.0 Jul 11, 2024
1.0.2 Nov 29, 2023

#2743 in Database interfaces

Download history 215/week @ 2024-03-14 216/week @ 2024-03-21 323/week @ 2024-03-28 260/week @ 2024-04-04 272/week @ 2024-04-11 418/week @ 2024-04-18 411/week @ 2024-04-25 343/week @ 2024-05-02 434/week @ 2024-05-09 359/week @ 2024-05-16 452/week @ 2024-05-23 369/week @ 2024-05-30 281/week @ 2024-06-06 317/week @ 2024-06-13 228/week @ 2024-06-20 154/week @ 2024-06-27

1,014 downloads per month



Apache HoraeDB (Incubating) Rust Client

License Crates.io


Rust client for Apache HoraeDB (Incubating).

[!IMPORTANT] Apache HoraeDB (incubating) is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC.

Please read the DISCLAIMER and a full explanation of "incubating".

Support features

  • Query
  • Write


Any contribution is welcome!

Read our Contributing Guide and make your first contribution!


Under Apache License 2.0.


This crate provides an user-friendly client for [HoraeDB](https://github.com/HoraeDB /horaedb).

With this crate, you can access a standalone HoraeDB or a HoraeDB cluster and manipulates the data in it. And the underlying communication between the client the HoraeDB servers is based on the gRPC, and the protocol is defined in the horaedbproto.

Choose Mode

Two access Modes are provided by the client, Proxy and Direct:

  • When accessing HoraeDB cluster by Direct mode, the requests will be sent directly to the right HoraeDB instance determined by routing information.
  • When accessing HoraeDB by Proxy mode, the requests are just sent to any one HoraeDB instance, which takes the responsibilities for forwarding the requests.

If the client can't access the HoraeDB server directly because of the network partition, Proxy mode is the only choice. Otherwise, Direct mode is suggested for better performance.


Build the client, and then manipulate the HoraeDB by writing and querying.


Here is an example to create a table in HoraeDB by the client.

let client = Builder::new("".to_string(), Mode::Direct).build();
let rpc_ctx = RpcContext::default().database("public".to_string());

let create_table_sql = r#"CREATE TABLE IF NOT EXISTS horaedb (
    str_tag string TAG,
    int_tag int32 TAG,
    var_tag varbinary TAG,
    str_field string,
    int_field int32,
    bin_field varbinary,
    t timestamp NOT NULL,
    TIMESTAMP KEY(t)) ENGINE=Analytic with

let req = SqlQueryRequest {
    tables: vec!["horaedb".to_string()],
    sql: create_table_sql.to_string(),
let resp = client
    .sql_query(&rpc_ctx, &req)
    .expect("Should succeed to create table");

println!("Create table result:{:?}", resp);


~438K SLoC