5个不稳定版本

0.3.0 2022年9月27日
0.2.0 2021年11月10日
0.1.1 2021年10月9日
0.1.1-rc.12021年10月6日
0.1.0 2021年9月29日

#5 in #spanner

MIT 许可证

120KB
2.5K SLoC

spanner-rs

一个异步Rust客户端,用于Cloud Spanner

Build Status Crates.io Documentation Crates.io

实现

客户端使用gRPC与Cloud Spanner接口。因此,这个包使用了tonic和相关包(例如:prosttowertokio)。

客户端还使用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