#driver #client #nosql


Official Rust client driver for Skytable

32 releases

0.7.5 May 24, 2023
0.7.4 Mar 17, 2023
0.7.3 Dec 24, 2022
0.7.2 Aug 23, 2022
0.4.0 Jun 27, 2021

#93 in Database interfaces

Download history 88/week @ 2023-05-31 97/week @ 2023-06-07 144/week @ 2023-06-14 96/week @ 2023-06-21 106/week @ 2023-06-28 61/week @ 2023-07-05 36/week @ 2023-07-12 55/week @ 2023-07-19 68/week @ 2023-07-26 35/week @ 2023-08-02 56/week @ 2023-08-09 95/week @ 2023-08-16 52/week @ 2023-08-23 78/week @ 2023-08-30 103/week @ 2023-09-06 118/week @ 2023-09-13

358 downloads per month
Used in 2 crates


2.5K SLoC

Skytable client Crates.io Test docs.rs GitHub release (latest SemVer including pre-releases)


This library is the official client for the free and open-source NoSQL database Skytable. First, go ahead and install Skytable by following the instructions here. This library supports all Skytable versions that work with the Skyhash 1.1 Protocol. This version of the library was tested with the latest Skytable release (release 0.7.6).


  • Sync API
  • Async API
  • TLS in both sync/async APIs
  • Connection pooling for sync/async
  • Use both sync/async APIs at the same time
  • Always up-to-date

Using this library

This library only ships with the bare minimum that is required for interacting with Skytable. Once you have Skytable installed and running, you're ready to follow this guide!

We'll start by creating a new binary application and then running actions. Create a new binary application by running:

cargo new skyapp

Tip: You can see a full list of the available actions here.

First add this to your Cargo.toml file:

skytable = "0.7.5"

Now open up your src/main.rs file and establish a connection to the server while also adding some imports:

use skytable::{Connection, Query, Element};
fn main() -> std::io::Result<()> {
    let mut con = Connection::new("", 2003)?;

Now let's run a Query! Change the previous code block to:

use skytable::{error, Connection, Query, Element};
fn main() -> Result<(), error::Error> {
    let mut con = Connection::new("", 2003)?;
    let query = Query::from("heya");
    let res: String = con.run_query(&query)?;
    assert_eq!(res, "HEY!");

Running actions

As noted below, the default table is a key/value table with a binary key type and a binary value type. Let's go ahead and run some actions (we're assuming you're using the sync API; for async, simply change the import to use skytable::actions::AsyncActions).

SETting a key

use skytable::actions::Actions;
use skytable::sync::Connection;

let mut con = Connection::new("", 2003).unwrap();
con.set("hello", "world").unwrap();

This will set the value of the key hello to world in the default:default entity.

GETting a key

use skytable::actions::Actions;
use skytable::sync::Connection;

let mut con = Connection::new("", 2003).unwrap();
let x: String = con.get("hello").unwrap();
assert_eq!(x, "world");

Way to go — you're all set! Now go ahead and run more advanced queries!

Binary data

The default:default keyspace has the following declaration:

Keymap { data:(binstr,binstr), volatile:false }

This means that the default keyspace is ready to store binary data. Let's say you wanted to SET the value of a key called bindata to some binary data stored in a Vec<u8>. You can achieve this with the RawString type:

use skytable::actions::Actions;
use skytable::sync::Connection;
use skytable::types::RawString;

let mut con = Connection::new("", 2003).unwrap();
let mybinarydata = RawString::from(vec![1, 2, 3, 4]);
assert!(con.set("bindata", mybinarydata).unwrap());

Going advanced

Now that you know how you can run basic queries, check out the actions module documentation for learning to use actions and the types module documentation for implementing your own Skyhash serializable types. Need to meddle with DDL queries like creating and dropping tables? Check out the [ddl] module. You can also find some examples here

Connection pooling

This library supports using sync/async connection pools. See the pool module-level documentation for examples and information.

Async API

If you need to use an async API, just change your import to:

skytable = { version = "0.7.2", features=["aio"], default-features = false }

You can now establish a connection by using skytable::AsyncConnection::new(), adding .awaits wherever necessary. Do note that you'll the Tokio runtime.

Using both sync and async APIs

With this client driver, it is possible to use both sync and async APIs at the same time. To do this, simply change your import to:

skytable = { version="0.7.2", features=["sync", "aio"] }


If you need to use TLS features, this crate will let you do so with OpenSSL.

Using TLS with sync interfaces

skytable = { version="0.7.2", features=["sync","ssl"] }

You can now use the async sync::TlsConnection object.

Using TLS with async interfaces

skytable = { version="0.7.2", features=["aio","aio-ssl"], default-features=false }

You can now use the async aio::TlsConnection object.

Packed TLS setup

If you want to pack OpenSSL with your crate, then for sync add sslv instead of ssl or add aio-sslv instead of aio-ssl for async. Adding this will statically link OpenSSL to your crate. Do note that you'll need a C compiler, GNU Make and Perl to compile OpenSSL and statically link against it.


The MSRV for this crate is Rust 1.39. Need const generics? Add the const-gen feature to your dependency!


Open-source, and contributions ... — they're always welcome! For ideas and suggestions, create an issue on GitHub and for patches, fork and open those pull requests here!


This client library is distributed under the permissive Apache-2.0 License. Now go build great apps!


~99K SLoC