5个不稳定版本
0.3.0 | 2022年9月27日 |
---|---|
0.2.0 | 2021年11月10日 |
0.1.1 | 2021年10月9日 |
0.1.1-rc.1 | 2021年10月6日 |
0.1.0 | 2021年9月29日 |
#5 in #spanner
120KB
2.5K SLoC
spanner-rs
一个异步Rust客户端,用于Cloud Spanner。
实现
客户端使用gRPC与Cloud Spanner接口。因此,这个包使用了tonic
和相关包(例如:prost
、tower
和tokio
)。
客户端还使用bb8
来维护一个Cloud Spanner会话池(在概念上类似于其他数据库中的连接池)。
实现受到出色的postgres
和相关包的极大启发。
状态
Spanner是一个复杂的数据库,此客户端并未实现所有可用功能。当前重点是获取符合习惯的SQL读写支持。
不推荐在生产环境中用于任何重要的工作负载。
功能
数据库客户端
- 只读、单次使用、时间限制的事务
- 带重试的读写事务
- 类型类将Rust值转换为Cloud Spanner值
- 支持时间戳和日期类型(chrono功能?)
- 支持JSON类型(serde json功能)
- 流式结果集
- 为struct结构体派生ToSpanner和FromSpanner
管理客户端
- DDL语句
示例
use spanner_rs::{Client, Error, ReadContext, TransactionContext};
#[tokio::main]
async fn main() -> Result<(), Error> {
let mut client = Client::configure()
.project("my-gcp-project")
.instance("my-instance")
.database("my-database")
.connect()
.await?;
// assuming the following table:
// person(id INT64, name STRING(MAX), data BYTES(MAX))
client
.read_write()
.run(|tx| {
tx.execute_update(
"INSERT INTO person(id, name, data) VALUES(@id, @name, NULL)",
&[("id", &42), ("name", &"ferris")],
)
})
.await?;
let result_set = client
.read_only()
.execute_query("SELECT * FROM person", &[])
.await?;
for row in result_set.iter() {
let id: u32 = row.get("id")?;
let name: &str = row.get("name")?;
let data: Option<&[u8]> = row.get("data")?;
println!("found person: {} {} {:?}", id, name, data);
}
Ok(())
}
依赖项
~101MB
~1.5M SLoC