rust.mdx 3.3 KB
Newer Older
D
dingbo 已提交
1 2 3
---
title: Rust Connector
---
B
Bo Ding 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

![Crates.io](https://img.shields.io/crates/v/libtaos) ![Crates.io](https://img.shields.io/crates/d/libtaos)

> Rust 连接器仍然在快速开发中,版本 API 变动在所难免,在 1.0 之前无法保证其向后兼容,请使用时注意版本及对应的文档。

感谢 [@songtianyi](https://github.com/songtianyi) 对 [libtdengine](https://github.com/songtianyi/tdengine-rust-bindings) 的贡献,使 Rust 社区能够使用 Rust 连接[TDengine]. [libtaos-rs] 项目旨在为 Rust 开发者提供官方支持,使用 taosc 接口及 HTTP 接口构建兼容 API 以便于用户切换接口方式。

## 依赖

- [Rust](https://www.rust-lang.org/learn/get-started)

默认情况下,[libtaos-rs] 使用 C 接口连接数据库,所以您需要:

- [TDengine 客户端](https://www.taosdata.com/cn/getting-started/#%E9%80%9A%E8%BF%87%E5%AE%89%E8%A3%85%E5%8C%85%E5%AE%89%E8%A3%85)
- `clang`: `bindgen` 使用 `libclangAST` 来生成对应的 Rust 绑定。

## 特性列表

- [x] C 接口的 Rust 绑定
- [x] 使用 `rest` feature 来启用 RESTful API.
- [x] [r2d2] 连接池支持(feature `r2d2`)
- [ ] 迭代器接口
- [ ] 流式计算接口
- [ ] 订阅支持

## 构建和测试

```sh
cargo build
cargo test
```

测试使用默认用户名密码和本地连接。您可以根据具体情况设置环境变量:

- `TEST_TAOS_IP`
- `TEST_TAOS_PORT`
- `TEST_TAOS_USER`
- `TEST_TAOS_PASS`
- `TEST_TAOS_DB`

## 使用

使用默认的 taosc 连接方式,可以在 `Cargo.toml` 中直接添加 `libtaos` 依赖:

```toml
[dependencies]
libtaos = "v0.3.8"
```

添加 feature `r2d2` 来启动连接池:

```toml
[dependencies]
libtaos = { version = "*", features = ["r2d2"] }
```

对于 RESTful 接口,可使用 `rest` 特性来替代 taosc,免去安装 TDengine 客户端。

```toml
[dependencies]
libtaos = { version = "*", features = ["rest"] }
```

本项目中提供一个 [示例程序](https://github.com/taosdata/libtaos-rs/blob/main/examples/demo.rs) 如下:

```rust
// ...
#[tokio::main]
async fn main() -> Result<(), Error> {
    init();
    let taos = taos_connect()?;

    assert_eq!(
        taos.query("drop database if exists demo").await.is_ok(),
        true
    );
    assert_eq!(taos.query("create database demo").await.is_ok(), true);
    assert_eq!(taos.query("use demo").await.is_ok(), true);
    assert_eq!(
        taos.query("create table m1 (ts timestamp, speed int)")
            .await
            .is_ok(),
        true
    );

    for i in 0..10i32 {
        assert_eq!(
            taos.query(format!("insert into m1 values (now+{}s, {})", i, i).as_str())
                .await
                .is_ok(),
            true
        );
    }
    let rows = taos.query("select * from m1").await?;

    println!("{}", rows.column_meta.into_iter().map(|col| col.name).join(","));
    for row in rows.rows {
        println!("{}", row.into_iter().join(","));
    }
    Ok(())
}
```

您可以在 [bailongma-rs] - 一个 Rust 编写的 Prometheus 远程存储 API 适配器 - 看到如何在具体应用中使用 Rust 连接器。

B
Bo Ding 已提交
109 110 111 112
## API 参考

[API 参考手册](https://docs.rs/libtaos/latest/libtaos/)

B
Bo Ding 已提交
113 114 115 116
[libtaos-rs]: https://github.com/taosdata/libtaos-rs
[tdengine]: https://github.com/taosdata/TDengine
[bailongma-rs]: https://github.com/taosdata/bailongma-rs
[r2d2]: https://crates.io/crates/r2d2