2 个版本

使用旧的 Rust 2015

0.1.1 2018年6月28日
0.1.0 2018年6月20日

#2180数据库接口

自定义许可

3MB
60K SLoC

rustyspanner

一个为 Rust 设计的 RPC Spanner 客户端。此客户端基于 Google 的 Python 客户端

文档

请查看 文档 以深入了解此客户端。

安装

使用 cargo 在项目中安装客户端

cargo install rustyspanner

入门

身份验证

为此应用程序进行身份验证,此客户端使用 Google 的 应用程序默认凭证 来查找您的应用程序凭证

实例化客户端

首先,我们为客户端提供项目 ID 以进行实例化。

let mut client = Client::new(String::from("project_id"));
assert_eq!(client.project_name(), String::from("projects/project_id"));

使用此客户端对象,我们可以列出可用的实例以获取感兴趣的实例,或者我们可以创建已存在实例的实例对象

//List instances
let instances = client.list_instances().instances;

//Instantiate an already existing instance
let id = String::from("instance_id")
let instance = let instance = client.instance(id, None, None, None);
assert_eq!(instance.name(), client.project_name() + "/instances/instance_id");

数据库

一旦我们有了实例对象,我们就可以列出实例内部可用的数据库以选择要使用的数据库,我们可以实例化已存在的对象或创建一个新的数据库

//List databases
let databases = instance.list_databases().databases;

//Instantiate an already existing database
let id = String::from("database_id");
let db = instance.database(String::from("database_id"), None);
db.reload(); //Loads metadata

//Create a new database
let db = instance.database(String::from("new_db"), None);
let operation = db.create();

我们还可以删除或检查数据库是否已存在

//Drop database
db.drop();

//Check if exists
db.exists();

要运行事务,我们需要将 'run_in_transaction' 函数与一个闭包一起提供,此闭包接收事务对象并在添加突变后应返回相同的事务对象

let result = db.run_in_transaction(|mut txn| {
    //Table and columns
    let table = String::from("table_name");
    let columns = vec![String::from("key"), String::from("value")];
    
    //Protobuf Value object for the values to add
    let mut key = Value::new();
    key.set_string_value(String::from("test"));
    let mut val = Value::new();
    val.set_string_value(String::from("27"));
    
    //Insert Mutation
    txn.insert(table.clone(), columns.clone(), vec![vec![key.clone(), val.clone()]]);
    
    //Update Mutation
    val.set_string_value(String::from("28"));
    txn.update(table.clone(), columns.clone(), vec![vec![key.clone(), val.clone()]]);
    
    //Update or insert Mutation
    key.set_string_value(String::from("testd"));
    val.set_string_value(String::from("11"));
    txn.upsert(table.clone(), columns.clone(), vec![vec![key.clone(), val.clone()]]);
    
    //Delete Mutation
    let keyset = KeySet::new(Some(vec![String::from("testd")]), None, None);
    txn.delete(table.clone(), keyset);
    
    //Commit transaction
    txn.commit();
    txn
});

会话

要运行数据库上的事务,我们可以直接使用数据库,如前面的部分所示,或者我们可以使用数据库对象创建会话并运行事务

let mut session = db.session();
session.create();
let result = session.run_in_transaction(|mut txn| {
    //Table and columns
    let table = String::from("table_name");
    let columns = vec![String::from("key"), String::from("value")];
    
    //Protobuf Value object for the values to add
    let mut key = Value::new();
    key.set_string_value(String::from("test"));
    let mut val = Value::new();
    val.set_string_value(String::from("27"));
    
    //Insert Mutation
    txn.insert(table.clone(), columns.clone(), vec![vec![key.clone(), val.clone()]]);
    
    //Commit transaction
    txn.commit();
    txn
});

一旦完成会话,您可以调用 delete 方法将其从云端删除

//Delete session
session.delete();

读取和查询

要从数据库读取和查询数据,我们可以使用 Snapshot 对象,此对象使用 Session 对象创建。以下示例展示了如何使用 KeySet 读取数据。目前 KeySet 接收要获取值的 String 表示形式,这可能在将来发生变化。

//Snapshot creation in a specific timestamp
let timestamp = Utc::now();
let mut snapshot = session.snapshot(Some(timestamp), None, None, None, false);

// Table and columns
let table = String::from("table_name");
let columns = vec![String::from("key"), String::from("value")];

//Keyset where we provide a vector of string where we request the object with key "hello"
let keyset = KeySet::new(Some(vec![String::from("hello")]), None, None);

//Call the method `read` and get a `StreamedResultSet` object
let mut streamed_result = snapshot.read(table, columns, keyset, None, None, None);

//Get the value
let v = streamed_result.one();
assert_eq!(v[0].get_string_value(), "hello");
assert_eq!(v[1].get_string_value(), "5");

要查询或执行数据库中的 sql,可以遵循以下示例

//Snapshot creation in a specific timestamp
let timestamp = Utc::now();
let mut snapshot = session.snapshot(Some(timestamp), None, None, None, false);

//SQL to execute
let sql = String::from("SELECT key, value FROM table_name WHERE value < @threshold");

//Parameters to replace on SQL
let mut params = HashMap::new();
let mut val = Value::new();
val.set_string_value(String::from("10"));
params.insert(String::from("threshold"), val);

//Types of parameters
let mut param_types = HashMap::new();
param_types.insert(String::from("threshold"), Type::INT64);

//Use method `execute_sql` to run query
let mut streamed_result = snapshot.execute_sql(sql, Some(params), Some(param_types), None, None);

//This query returned multiple values so we call method `next` to get the next value
let v = streamed_result.next().unwrap();
assert_eq!(v[0].get_string_value(), "hello");
assert_eq!(v[1].get_string_value(), "5");
let x = streamed_result.next().unwrap();
assert_eq!(x[0].get_string_value(), "goodbye");
assert_eq!(x[1].get_string_value(), "6");

构建工具

  • gRPC-rs - gRPC 核心的 Rust 封装。

许可

本项目采用 MIT 许可证 - 有关详细信息,请参阅 LICENSE 文件

致谢

依赖项

~33MB
~642K SLoC