7 个版本 (3 个稳定版)

使用旧的 Rust 2015

1.1.0 2018年8月14日
1.0.1 2017年8月19日
1.0.0 2017年7月13日
0.3.0 2017年4月27日
0.1.0 2016年12月14日

数据库接口 中排名 #2758

每月下载量 21

Apache-2.0

71KB
1.5K SLoC

Rust 的 CrateDB 驱动

Build Status Crates.io

CrateDB 是由 Crate.io 提供的一个分布式 SQL 数据库,此驱动提供了对它的访问。

快速入门

需要 None::<Box<NoParams>> 来告诉编译器盒子实际拥有的类型。NoParams 是一个空的结构体 😁 如果有更好的解决方案,请提交一个 issue

extern crate cratedb;

use cratedb::{Cluster, NoParams};
use cratedb::sql::QueryRunner; // SQL query trait
use cratedb::blob::BlobContainer;  // BLOB container trait
use cratedb::row::ByIndex;
use std::iter;
use std::io::Cursor;

fn main() {
    // default URL for a local CrateDB instance
    let nodes = "http://localhost:4200/";

    // create a cluster
    let c: Cluster = Cluster::from_string(nodes).unwrap();

    // a simple query
    let stmt = "select hostname, name from sys.nodes";
    println!("Running: {}", stmt);
    let (elapsed, rows) = c.query(stmt, None::<Box<NoParams>>).unwrap();

    for r in rows {
      // cast and retrieve the values
      let hostname = r.as_string(0).unwrap();
      let nodename = r.as_string(1).unwrap();
        println!("hostname: {}, name: {}", hostname , nodename);
    }
    println!("The query took {} ms", elapsed);

    // DDL statements
    let (elapsed, rows) = c.query("create table a(a string)", None::<Box<NoParams>>).unwrap();

    // parameterized DML statements
    let p = Box::new(vec!(1234));
    let (elapsed, rows)  = c.query("insert into a(a) values (?)", Some(p)).unwrap();

    let bulk = vec!(["a"],["b"],["c"],["d"],["e"],["f"],["g"],["h"],["i"]);

    // parameterized bulk DML statements
    let stmt = "insert into a(a) values (?)";
    println!("Running: {}", stmt);
    let (elapsed, results)  = c.bulk_query(stmt, Box::new(bulk.clone())).unwrap();
    for r in results {
        println!("Inserted {} rows", r);
    }
    println!("The query took {} ms", elapsed);

    // drop this table
    let _  = c.query("drop table a", None::<Box<NoParams>>);

        // create a blob table
    let _ = c.query("create blob table b", None::<Box<NoParams>>)
        .unwrap();

    // create an arbitrary blob
    let myblob: Vec<u8> = iter::repeat(0xA).take(1024).collect();

    // upload blob
    let r = c.put("b", &mut Cursor::new(&myblob)).unwrap();

    println!("Uploaded BLOB: {:?}", r);

    // fetch blob
    let mut actual = c.get(&r).unwrap();
    let mut buffer: Vec<u8> = vec![];
    let _ = actual.read_to_end(&mut buffer);

    // compare
    assert_eq!(myblob, buffer);

    // delete blob & clean up
    let _ = c.delete(r);
    let _ = c.query("drop blob table b", None::<Box<NoParams>>).unwrap();
}

输出

Running: select hostname, name from sys.nodes
hostname: x5ff, name: Höllwand
The query took 1.322622 ms
Running: insert into a(a) values (?)
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
Inserted 1 rows
The query took 33.12071 ms
Uploaded BLOB: BlobRef { sha1: [143, 198, 224, 5, 9, 204, 175, 189, 111, 81, 168, 87, 152, 164, 23, 151, 240, 96, 249, 190], table: "b" }

许可证

本项目是在 Apache 2.0 许可证下开发的。

贡献者

感谢 teuronPR #5 中的贡献

依赖项

~14MB
~375K SLoC