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 次
71KB
1.5K SLoC
Rust 的 CrateDB 驱动
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 许可证下开发的。
贡献者
依赖项
~14MB
~375K SLoC