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 文件
致谢
- 云Spanner的Python客户端 - Cloud Spanner的Python风格客户端。
依赖项
~33MB
~642K SLoC