6个版本 (3 разрушающих)

0.4.0 2020年8月23日
0.3.1 2020年3月1日
0.3.0 2020年1月19日
0.2.0 2019年9月22日
0.1.0 2018年1月28日

#1157 in Database interfaces

每月下载量:31

MIT许可证

215KB
5.5K SLoC

Rust客户端用于dgraph

crates.io version Build Status

Dgraph Rust客户端,使用gRPC与服务器通信。

在使用此客户端之前,强烈建议您通过tour.dgraph.iodocs.dgraph.io了解如何运行和与Dgraph一起工作。

目录

Предварительные условия

dgraph поддерживает только версии Dgraph 1.1 или выше.

Поскольку этот crate использует grpcio, который является оберткой вокруг библиотеки C++ и требует некоторых предварительных условий перед установкой. Вы можете найти их в grpcio documentation.

安装

dgraph доступен на crates.io. Добавьте следующую зависимость в ваш Cargo.toml.

[dependencies]
dgraph = "0.4.0"

Доступны также несколько функций passthrough grpcio

  • openssl
  • openssl-vendored

Эти функции описаны в grpcio documentation.

使用客户端

创建客户端

Объект Dgraph можно инициализировать, передав в него список клиентов dgraph::DgraphClient в вектор. Подключение к нескольким серверам Dgraph в одной и той же кластере позволяет лучше распределять нагрузку. Библиотека предоставляет макрос для этого.

Следующий фрагмент кода показывает только одно подключение.

let dgraph = make_dgraph!(dgraph::new_dgraph_client("localhost:9080"));

Альтернативно, можно использовать безопасного клиента

fn open_cert_file(path: &str) -> Vec<u8> {
  ...
}

let root_ca = open_cert_file("./tls/ca.crt");
let cert = open_cert_file("./tls/client.user.crt");
let private_key = open_cert_file("./tls/client.user.key");

let dgraph = make_dgraph!(dgraph::new_secure_dgraph_client(
    "localhost:9080",
    root_ca,
    cert,
    private_key
));

更改数据库

Чтобы установить схему, создайте экземпляр dgraph::Operation и используйте точку końca Alter.

let op = dgraph::Operation{
  schema: "name: string @index(exact) .".to_string(), ..Default::default()
};
let result = dgraph.alter(&op);
// Check error

操作 包含其他字段,包括 DropAttrDropAll。当您希望丢弃所有数据,从头开始而不需要关闭实例时,DropAll 非常有用。DropAttr 用于删除与谓词相关联的所有数据。

创建事务

要创建一个事务,调用 dgraph.new_txn(),它返回一个 dgraph::Txn 对象。此操作不产生网络开销。

一旦 dgraph::Txn 超出作用域,将通过 Drop 特性自动调用 txn.discard()。在 txn.commit() 之后调用 txn.discard() 是无操作的,多次调用此方法也没有额外的副作用。

let txn = dgraph.new_txn();

运行突变

txn.mutate(mu) 执行一个突变。它接受一个 dgraph::Mutation 对象。您可以使用 JSON 或 RDF N-Quad 格式设置数据。

我们定义一个 Person 结构体来表示一个人物,并将其实例序列化以用于 Mutation 对象。

#[derive(Serialize, Deserialize, Default, Debug)]
struct Person {
  uid: String,
  name: String,
}

let p = Person {
  uid:  "_:alice".to_string(),
  Name: "Alice".to_string(),
}

let pb = serde_json::to_vec(&p).expect("Invalid json");

let mut mu = dgraph::Mutation {
  json: pb, ..Default::default()
};

let assigned = txn.mutate(mu).expect("failed to create data");

有关更完整的示例,请参阅简单的示例 simple(或具有安全客户端的相同示例)。

有时,您可能只想提交突变,而不进行任何查询。在这种情况下,您可以使用 mu.commit_now = true 来指示突变必须立即提交。

运行查询

您可以通过调用 txn.query(q) 来执行查询。您需要传递一个 GraphQL+- 查询字符串。如果您想要传递一个包含您可能想要在查询中设置的任何变量的附加映射,请调用 txn.query_with_vars(q, vars),并将变量映射作为第三个参数。

让我们用一个变量 $a 执行以下查询

let q = r#"query all($a: string) {
    all(func: eq(name, $a)) {
      name
    }
  }"#;

let mut vars = HashMap::new();
vars.insert("$a".to_string(), "Alice".to_string());

let resp = dgraph.new_readonly_txn().query_with_vars(&q, vars).expect("query");
let root: Root = serde_json::from_slice(&resp.json).expect("parsing");
println!("Root: {:#?}", root);

当运行模式查询时,模式响应位于 dgraph::ResponseSchema 字段中。

let q = r#"schema(pred: [name]) {
  type
  index
  reverse
  tokenizer
  list
  count
  upsert
  lang
}"#;

let resp = txn.query(&q)?;
println!("{:#?}", resp.schema);

提交事务

您可以使用 txn.commit() 方法提交事务。如果您的交易仅由对 txn.querytxn.query_with_vars 的调用组成,而没有对 txn.mutate 的调用,则不需要调用 txn.commit

如果其他并发事务修改了在此事务中修改的同一数据,将返回错误。当事务失败时,由用户决定重试事务。

let txn = dgraph.new_txn();
// Perform some queries and mutations.

let res = txn.commit();
if res.is_err() {
  // Retry or handle error
}

Интеграция тестирования

测试需要Dgraph在本地主机上运行,端口号为localhost:19080。为了方便,根目录下准备了几个docker-compose-*.yaml文件,具体取决于您要测试的Dgraph版本。

docker-compose -f docker-compose-*.yaml up -d

由于我们正在与数据库工作,测试也需要在单个线程中运行以防止中断。例如:

cargo test -- --test-threads=1

Присоединение к проекту

欢迎贡献。请随意提出问题,包括功能请求、错误修复和改进。

如果您修改了src/protos/api.proto文件之一,您需要重新生成由Protocol Buffer工具生成的源文件。为此,请安装Protocol Buffer编译器,然后运行以下命令

cargo run --features="compile-protobufs" --bin protoc

发布清单

这些必须在支持的每个版本中完成

  • 运行测试
  • 尝试示例

更新版本并发布crate

  • 更新Cargo.toml中的标签
  • 更新README.md中的标签
  • git标签v0.X.X
  • git推送origin v0.X.X
  • 在GitHub上编写发布日志
  • cargo发布

依赖关系

~32–44MB
~794K SLoC