diff --git a/src/.vuepress/sidebar/V2.0.x/en-Table.ts b/src/.vuepress/sidebar/V2.0.x/en-Table.ts
index bf72d970e..4312ed68b 100644
--- a/src/.vuepress/sidebar/V2.0.x/en-Table.ts
+++ b/src/.vuepress/sidebar/V2.0.x/en-Table.ts
@@ -184,6 +184,7 @@ export const enSidebar = {
{ text: 'C++ Native API', link: 'Programming-Cpp-Native-API_apache' },
{ text: 'GO Native API', link: 'Programming-Go-Native-API_apache' },
{ text: 'C# Native API', link: 'Programming-CSharp-Native-API_apache' },
+ { text: 'Rust Native API', link: 'Programming-Rust-Native-API_apache' },
{ text: 'JDBC', link: 'Programming-JDBC_apache' },
{ text: 'MQTT Protocol', link: 'Programming-MQTT_apache' },
{ text: 'RESTAPI V1 ', link: 'RestAPI-V1_apache' },
diff --git a/src/.vuepress/sidebar/V2.0.x/zh-Table.ts b/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
index 3a0364a21..418977215 100644
--- a/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
+++ b/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
@@ -183,6 +183,7 @@ export const zhSidebar = {
{ text: 'C++原生接口', link: 'Programming-Cpp-Native-API_apache' },
{ text: 'GO原生接口', link: 'Programming-Go-Native-API_apache' },
{ text: 'C#原生接口', link: 'Programming-CSharp-Native-API_apache' },
+ { text: 'Rust原生接口', link: 'Programming-Rust-Native-API_apache' },
{ text: 'JDBC', link: 'Programming-JDBC_apache' },
{ text: 'MQTT协议', link: 'Programming-MQTT_apache' },
{ text: 'RESTAPI V1 ', link: 'RestServiceV1_apache' },
diff --git a/src/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md b/src/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md
new file mode 100644
index 000000000..fa8252ff8
--- /dev/null
+++ b/src/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md
@@ -0,0 +1,134 @@
+
+
+# Rust Native API
+
+Apache IoTDB provides an official Rust client SDK: [apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust). It speaks the Thrift RPC protocol (default port 6667). This document covers the **table model** (`TableSession` / `TableSessionPool`, relational SQL dialect); the tree model is documented separately.
+
+## 1. Requirements
+
+- Rust 1.75+
+- Apache IoTDB 2.x — see [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md) for the full server version matrix
+
+## 2. Installation
+
+Once published to crates.io:
+
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
+```
+
+Until then, use a git dependency:
+
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
+
+The import name is `iotdb_client` in both cases.
+
+## 3. Quick start
+
+```rust
+use iotdb_client::{ColumnCategory, Result, TSDataType, TableSession, Tablet, Value};
+
+fn main() -> Result<()> {
+ let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .username("root")
+ .password("root")
+ .build()?;
+
+ session.execute_non_query("CREATE DATABASE IF NOT EXISTS demo")?;
+ session.execute_non_query("USE demo")?;
+ session.execute_non_query(
+ "CREATE TABLE IF NOT EXISTS sensors (device_id STRING TAG, temperature DOUBLE FIELD)",
+ )?;
+
+ // Column-major tablet write. columnCategories must NOT include TIME —
+ // the time column is implicit.
+ let mut tablet = Tablet::new_table(
+ "sensors",
+ vec!["device_id".into(), "temperature".into()],
+ vec![TSDataType::String, TSDataType::Double],
+ vec![ColumnCategory::Tag, ColumnCategory::Field],
+ )?;
+ tablet.add_row(
+ 1_720_000_000_000,
+ vec![
+ Some(Value::String("dev-1".into())),
+ Some(Value::Double(21.5)),
+ ],
+ )?;
+ session.insert(&tablet)?;
+
+ // Query with row iteration; the dataset borrows the session until dropped.
+ {
+ let mut dataset =
+ session.execute_query("SELECT time, device_id, temperature FROM sensors")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("{:?}", row.values);
+ }
+ }
+
+ session.execute_non_query("DROP DATABASE demo")?;
+ session.close()
+}
+```
+
+## 4. Session pool
+
+`TableSessionPool` is the thread-safe pool variant for concurrent workloads; `acquire()` returns an RAII guard that releases the session back to the pool on drop. See the runnable [`session_pool` example](https://github.com/apache/iotdb-client-rust/blob/main/examples/session_pool.rs).
+
+## 5. TLS & RPC compression
+
+**RPC compression** (the Thrift compact protocol) must match the server setting `dn_rpc_thrift_compression_enable` (default `false`):
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .enable_rpc_compression(true)
+ .build()?;
+```
+
+**TLS** is behind the `tls` cargo feature:
+
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .use_ssl(true)
+ .ca_cert_path("ca.pem")
+ .build()?;
+```
+
+## 6. Examples
+
+Full runnable examples live in the repository's [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) directory:
+
+```sh
+cargo run --example table_session
+cargo run --example session_pool
+```
diff --git a/src/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md b/src/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
index f3fcacf46..e4a8b0a08 100644
--- a/src/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
+++ b/src/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
@@ -21,168 +21,147 @@
# Rust Native API
-IoTDB uses Thrift as a cross language RPC framework, so access to IoTDB can be achieved through the interface provided by Thrift.
-This document will introduce how to generate a native Rust interface that can access IoTDB.
+Apache IoTDB provides an official Rust client SDK: [apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust). It speaks the Thrift RPC protocol (default port 6667) and supports both IoTDB data models:
-## 1. Dependents
+- **Tree model** — `Session` / `SessionPool`: device/timeseries paths (`root.sg.d1.s1`), covered in this document
+- **Table model** — `TableSession` / `TableSessionPool`: relational SQL dialect
- * JDK >= 1.8
- * Rust >= 1.0.0
- * thrift 0.14.1
- * Linux、Macos or like unix
- * Windows+bash
+## 1. Requirements
-Thrift (0.14.1 or higher) must be installed to compile Thrift files into Rust code. The following is the official installation tutorial, and in the end, you should receive a Thrift executable file.
+- Rust 1.75+
+- Apache IoTDB 2.x — see [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md) for the full server version matrix
-```
-http://thrift.apache.org/docs/install/
-```
+## 2. Installation
-## 2. Compile the Thrift library and generate the Rust native interface
-
-1. Find the `pom.xml` file in the root directory of the IoTDB source code folder.
-2. Open the `pom.xml` file and find the following content:
- ```xml
-
- generate-thrift-sources-python
- generate-sources
-
- compile
-
-
- py
- ${project.build.directory}/generated-sources-python/
-
-
- ```
-3. Duplicate this block and change the `id`, `generator` and `outputDirectory` to this:
- ```xml
-
- generate-thrift-sources-rust
- generate-sources
-
- compile
-
-
- rs
- ${project.build.directory}/generated-sources-rust/
-
-
- ```
-4. In the root directory of the IoTDB source code folder,run `mvn clean generate-sources`.
-
-This command will automatically delete the files in `iotdb/iotdb-protocol/thrift/target` and `iotdb/iotdb-protocol/thrift-commons/target`, and repopulate the folder with the newly generated files.
-The newly generated Rust sources will be located in `iotdb/iotdb-protocol/thrift/target/generated-sources-rust` in the various modules of the `iotdb-protocol` module.
-
-## 3. Using the Rust native interface
-
-Copy `iotdb/iotdb-protocol/thrift/target/generated-sources-rust/` and `iotdb/iotdb-protocol/thrift-commons/target/generated-sources-rust/` into your project。
-
-## 4. RPC interface
+Once published to crates.io:
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
```
-// open a session
-TSOpenSessionResp openSession(1:TSOpenSessionReq req);
-
-// close a session
-TSStatus closeSession(1:TSCloseSessionReq req);
-
-// run an SQL statement in batch
-TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
-
-// execute SQL statement in batch
-TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
-
-// execute query SQL statement
-TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
-
-// execute insert, delete and update SQL statement
-TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
-
-// fetch next query result
-TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
-
-// fetch meta data
-TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
-
-// cancel a query
-TSStatus cancelOperation(1:TSCancelOperationReq req);
-
-// close a query dataset
-TSStatus closeOperation(1:TSCloseOperationReq req);
-
-// get time zone
-TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
-
-// set time zone
-TSStatus setTimeZone(1:TSSetTimeZoneReq req);
-
-// get server's properties
-ServerProperties getProperties();
-
-// CREATE DATABASE
-TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
-// create timeseries
-TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
+Until then, use a git dependency:
-// create multi timeseries
-TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
-
-// delete timeseries
-TSStatus deleteTimeseries(1:i64 sessionId, 2:list path)
-
-// delete sttorage groups
-TSStatus deleteStorageGroups(1:i64 sessionId, 2:list storageGroup);
-
-// insert record
-TSStatus insertRecord(1:TSInsertRecordReq req);
-
-// insert record in string format
-TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
-
-// insert tablet
-TSStatus insertTablet(1:TSInsertTabletReq req);
-
-// insert tablets in batch
-TSStatus insertTablets(1:TSInsertTabletsReq req);
-
-// insert records in batch
-TSStatus insertRecords(1:TSInsertRecordsReq req);
-
-// insert records of one device
-TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
-// insert records in batch as string format
-TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
+The import name is `iotdb_client` in both cases.
+
+## 3. Quick start
+
+```rust
+use iotdb_client::{Result, Session, SessionConfig, TSDataType, Tablet, Value};
+
+fn main() -> Result<()> {
+ let config = SessionConfig::default().with_node_urls(&["127.0.0.1:6667"])?;
+ let mut session = Session::new(config);
+ session.open()?;
+
+ session.execute_non_query("CREATE DATABASE root.demo")?;
+ session.execute_non_query(
+ "CREATE TIMESERIES root.demo.d1.temperature WITH DATATYPE=DOUBLE, ENCODING=PLAIN",
+ )?;
+
+ // Batch write via a column-major tablet (nulls allowed).
+ let mut tablet = Tablet::new(
+ "root.demo.d1",
+ vec!["temperature".into()],
+ vec![TSDataType::Double],
+ )?;
+ tablet.add_row(1_720_000_000_000, vec![Some(Value::Double(21.5))])?;
+ tablet.add_row(1_720_000_001_000, vec![None])?; // null cell
+ session.insert_tablet(&tablet)?;
+
+ // Or write a single row via insertRecord (aligned variants and
+ // multi-row insert_records / insert_records_of_one_device also exist).
+ session.insert_record(
+ "root.demo.d1",
+ 1_720_000_002_000,
+ vec!["temperature".into()],
+ &[Value::Double(22.0)],
+ false, // is_aligned
+ )?;
+
+ // Query with row iteration; the dataset borrows the session until dropped.
+ {
+ let mut dataset = session.execute_query("SELECT temperature FROM root.demo.d1")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("ts={:?} values={:?}", row.timestamp, row.values);
+ }
+ }
+
+ session.execute_non_query("DELETE DATABASE root.demo")?;
+ session.close()
+}
+```
-// test the latency of innsert tablet,caution:no data will be inserted, only for test latency
-TSStatus testInsertTablet(1:TSInsertTabletReq req);
+## 4. Session pool
+
+`SessionPool` is a thread-safe pool for concurrent workloads. `acquire()` returns an RAII guard that releases the session back to the pool on drop:
+
+```rust
+use std::sync::Arc;
+use iotdb_client::{Result, SessionPool, SessionPoolConfig};
+
+fn main() -> Result<()> {
+ let config = SessionPoolConfig {
+ max_size: 4,
+ ..SessionPoolConfig::default()
+ }
+ .with_node_urls(&["127.0.0.1:6667"])?;
+ let pool = Arc::new(SessionPool::new(config)?);
+
+ let handles: Vec<_> = (0..4)
+ .map(|_| {
+ let pool = Arc::clone(&pool);
+ std::thread::spawn(move || -> Result<()> {
+ let mut session = pool.acquire()?;
+ session.execute_non_query("SHOW DATABASES")?;
+ Ok(())
+ })
+ })
+ .collect();
+ for handle in handles {
+ handle.join().expect("thread panicked")?;
+ }
+
+ pool.close();
+ Ok(())
+}
+```
-// test the latency of innsert tablets,caution:no data will be inserted, only for test latency
-TSStatus testInsertTablets(1:TSInsertTabletsReq req);
+## 5. TLS & RPC compression
-// test the latency of innsert record,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecord(1:TSInsertRecordReq req);
+**RPC compression** (the Thrift compact protocol) must match the server setting `dn_rpc_thrift_compression_enable` (default `false`):
-// test the latency of innsert record in string format,caution:no data will be inserted, only for test latency
-TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
+```rust
+let config = SessionConfig { enable_rpc_compression: true, ..Default::default() };
+```
-// test the latency of innsert records,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecords(1:TSInsertRecordsReq req);
+**TLS** is behind the `tls` cargo feature:
-// test the latency of innsert records of one device,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
-// test the latency of innsert records in string formate,caution:no data will be inserted, only for test latency
-TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
+```rust
+let config = SessionConfig {
+ use_ssl: true,
+ ca_cert_path: Some("ca.pem".into()), // trust a private CA / self-signed cert
+ accept_invalid_certs: false, // true skips verification (tests only!)
+ domain_override: None, // SNI/validation hostname when connecting by IP
+ ..Default::default()
+};
+```
-// delete data
-TSStatus deleteData(1:TSDeleteDataReq req);
+## 6. Examples
-// execute raw data query
-TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
+Full runnable examples live in the repository's [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) directory:
-// request a statement id from server
-i64 requestStatementId(1:i64 sessionId);
+```sh
+cargo run --example tree_session
+cargo run --example table_session
+cargo run --example session_pool
```
diff --git a/src/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md b/src/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md
new file mode 100644
index 000000000..fa8252ff8
--- /dev/null
+++ b/src/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md
@@ -0,0 +1,134 @@
+
+
+# Rust Native API
+
+Apache IoTDB provides an official Rust client SDK: [apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust). It speaks the Thrift RPC protocol (default port 6667). This document covers the **table model** (`TableSession` / `TableSessionPool`, relational SQL dialect); the tree model is documented separately.
+
+## 1. Requirements
+
+- Rust 1.75+
+- Apache IoTDB 2.x — see [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md) for the full server version matrix
+
+## 2. Installation
+
+Once published to crates.io:
+
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
+```
+
+Until then, use a git dependency:
+
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
+
+The import name is `iotdb_client` in both cases.
+
+## 3. Quick start
+
+```rust
+use iotdb_client::{ColumnCategory, Result, TSDataType, TableSession, Tablet, Value};
+
+fn main() -> Result<()> {
+ let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .username("root")
+ .password("root")
+ .build()?;
+
+ session.execute_non_query("CREATE DATABASE IF NOT EXISTS demo")?;
+ session.execute_non_query("USE demo")?;
+ session.execute_non_query(
+ "CREATE TABLE IF NOT EXISTS sensors (device_id STRING TAG, temperature DOUBLE FIELD)",
+ )?;
+
+ // Column-major tablet write. columnCategories must NOT include TIME —
+ // the time column is implicit.
+ let mut tablet = Tablet::new_table(
+ "sensors",
+ vec!["device_id".into(), "temperature".into()],
+ vec![TSDataType::String, TSDataType::Double],
+ vec![ColumnCategory::Tag, ColumnCategory::Field],
+ )?;
+ tablet.add_row(
+ 1_720_000_000_000,
+ vec![
+ Some(Value::String("dev-1".into())),
+ Some(Value::Double(21.5)),
+ ],
+ )?;
+ session.insert(&tablet)?;
+
+ // Query with row iteration; the dataset borrows the session until dropped.
+ {
+ let mut dataset =
+ session.execute_query("SELECT time, device_id, temperature FROM sensors")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("{:?}", row.values);
+ }
+ }
+
+ session.execute_non_query("DROP DATABASE demo")?;
+ session.close()
+}
+```
+
+## 4. Session pool
+
+`TableSessionPool` is the thread-safe pool variant for concurrent workloads; `acquire()` returns an RAII guard that releases the session back to the pool on drop. See the runnable [`session_pool` example](https://github.com/apache/iotdb-client-rust/blob/main/examples/session_pool.rs).
+
+## 5. TLS & RPC compression
+
+**RPC compression** (the Thrift compact protocol) must match the server setting `dn_rpc_thrift_compression_enable` (default `false`):
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .enable_rpc_compression(true)
+ .build()?;
+```
+
+**TLS** is behind the `tls` cargo feature:
+
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .use_ssl(true)
+ .ca_cert_path("ca.pem")
+ .build()?;
+```
+
+## 6. Examples
+
+Full runnable examples live in the repository's [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) directory:
+
+```sh
+cargo run --example table_session
+cargo run --example session_pool
+```
diff --git a/src/UserGuide/latest/API/Programming-Rust-Native-API.md b/src/UserGuide/latest/API/Programming-Rust-Native-API.md
index f3fcacf46..e4a8b0a08 100644
--- a/src/UserGuide/latest/API/Programming-Rust-Native-API.md
+++ b/src/UserGuide/latest/API/Programming-Rust-Native-API.md
@@ -21,168 +21,147 @@
# Rust Native API
-IoTDB uses Thrift as a cross language RPC framework, so access to IoTDB can be achieved through the interface provided by Thrift.
-This document will introduce how to generate a native Rust interface that can access IoTDB.
+Apache IoTDB provides an official Rust client SDK: [apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust). It speaks the Thrift RPC protocol (default port 6667) and supports both IoTDB data models:
-## 1. Dependents
+- **Tree model** — `Session` / `SessionPool`: device/timeseries paths (`root.sg.d1.s1`), covered in this document
+- **Table model** — `TableSession` / `TableSessionPool`: relational SQL dialect
- * JDK >= 1.8
- * Rust >= 1.0.0
- * thrift 0.14.1
- * Linux、Macos or like unix
- * Windows+bash
+## 1. Requirements
-Thrift (0.14.1 or higher) must be installed to compile Thrift files into Rust code. The following is the official installation tutorial, and in the end, you should receive a Thrift executable file.
+- Rust 1.75+
+- Apache IoTDB 2.x — see [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md) for the full server version matrix
-```
-http://thrift.apache.org/docs/install/
-```
+## 2. Installation
-## 2. Compile the Thrift library and generate the Rust native interface
-
-1. Find the `pom.xml` file in the root directory of the IoTDB source code folder.
-2. Open the `pom.xml` file and find the following content:
- ```xml
-
- generate-thrift-sources-python
- generate-sources
-
- compile
-
-
- py
- ${project.build.directory}/generated-sources-python/
-
-
- ```
-3. Duplicate this block and change the `id`, `generator` and `outputDirectory` to this:
- ```xml
-
- generate-thrift-sources-rust
- generate-sources
-
- compile
-
-
- rs
- ${project.build.directory}/generated-sources-rust/
-
-
- ```
-4. In the root directory of the IoTDB source code folder,run `mvn clean generate-sources`.
-
-This command will automatically delete the files in `iotdb/iotdb-protocol/thrift/target` and `iotdb/iotdb-protocol/thrift-commons/target`, and repopulate the folder with the newly generated files.
-The newly generated Rust sources will be located in `iotdb/iotdb-protocol/thrift/target/generated-sources-rust` in the various modules of the `iotdb-protocol` module.
-
-## 3. Using the Rust native interface
-
-Copy `iotdb/iotdb-protocol/thrift/target/generated-sources-rust/` and `iotdb/iotdb-protocol/thrift-commons/target/generated-sources-rust/` into your project。
-
-## 4. RPC interface
+Once published to crates.io:
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
```
-// open a session
-TSOpenSessionResp openSession(1:TSOpenSessionReq req);
-
-// close a session
-TSStatus closeSession(1:TSCloseSessionReq req);
-
-// run an SQL statement in batch
-TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
-
-// execute SQL statement in batch
-TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
-
-// execute query SQL statement
-TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
-
-// execute insert, delete and update SQL statement
-TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
-
-// fetch next query result
-TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
-
-// fetch meta data
-TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
-
-// cancel a query
-TSStatus cancelOperation(1:TSCancelOperationReq req);
-
-// close a query dataset
-TSStatus closeOperation(1:TSCloseOperationReq req);
-
-// get time zone
-TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
-
-// set time zone
-TSStatus setTimeZone(1:TSSetTimeZoneReq req);
-
-// get server's properties
-ServerProperties getProperties();
-
-// CREATE DATABASE
-TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
-// create timeseries
-TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
+Until then, use a git dependency:
-// create multi timeseries
-TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
-
-// delete timeseries
-TSStatus deleteTimeseries(1:i64 sessionId, 2:list path)
-
-// delete sttorage groups
-TSStatus deleteStorageGroups(1:i64 sessionId, 2:list storageGroup);
-
-// insert record
-TSStatus insertRecord(1:TSInsertRecordReq req);
-
-// insert record in string format
-TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
-
-// insert tablet
-TSStatus insertTablet(1:TSInsertTabletReq req);
-
-// insert tablets in batch
-TSStatus insertTablets(1:TSInsertTabletsReq req);
-
-// insert records in batch
-TSStatus insertRecords(1:TSInsertRecordsReq req);
-
-// insert records of one device
-TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
-// insert records in batch as string format
-TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
+The import name is `iotdb_client` in both cases.
+
+## 3. Quick start
+
+```rust
+use iotdb_client::{Result, Session, SessionConfig, TSDataType, Tablet, Value};
+
+fn main() -> Result<()> {
+ let config = SessionConfig::default().with_node_urls(&["127.0.0.1:6667"])?;
+ let mut session = Session::new(config);
+ session.open()?;
+
+ session.execute_non_query("CREATE DATABASE root.demo")?;
+ session.execute_non_query(
+ "CREATE TIMESERIES root.demo.d1.temperature WITH DATATYPE=DOUBLE, ENCODING=PLAIN",
+ )?;
+
+ // Batch write via a column-major tablet (nulls allowed).
+ let mut tablet = Tablet::new(
+ "root.demo.d1",
+ vec!["temperature".into()],
+ vec![TSDataType::Double],
+ )?;
+ tablet.add_row(1_720_000_000_000, vec![Some(Value::Double(21.5))])?;
+ tablet.add_row(1_720_000_001_000, vec![None])?; // null cell
+ session.insert_tablet(&tablet)?;
+
+ // Or write a single row via insertRecord (aligned variants and
+ // multi-row insert_records / insert_records_of_one_device also exist).
+ session.insert_record(
+ "root.demo.d1",
+ 1_720_000_002_000,
+ vec!["temperature".into()],
+ &[Value::Double(22.0)],
+ false, // is_aligned
+ )?;
+
+ // Query with row iteration; the dataset borrows the session until dropped.
+ {
+ let mut dataset = session.execute_query("SELECT temperature FROM root.demo.d1")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("ts={:?} values={:?}", row.timestamp, row.values);
+ }
+ }
+
+ session.execute_non_query("DELETE DATABASE root.demo")?;
+ session.close()
+}
+```
-// test the latency of innsert tablet,caution:no data will be inserted, only for test latency
-TSStatus testInsertTablet(1:TSInsertTabletReq req);
+## 4. Session pool
+
+`SessionPool` is a thread-safe pool for concurrent workloads. `acquire()` returns an RAII guard that releases the session back to the pool on drop:
+
+```rust
+use std::sync::Arc;
+use iotdb_client::{Result, SessionPool, SessionPoolConfig};
+
+fn main() -> Result<()> {
+ let config = SessionPoolConfig {
+ max_size: 4,
+ ..SessionPoolConfig::default()
+ }
+ .with_node_urls(&["127.0.0.1:6667"])?;
+ let pool = Arc::new(SessionPool::new(config)?);
+
+ let handles: Vec<_> = (0..4)
+ .map(|_| {
+ let pool = Arc::clone(&pool);
+ std::thread::spawn(move || -> Result<()> {
+ let mut session = pool.acquire()?;
+ session.execute_non_query("SHOW DATABASES")?;
+ Ok(())
+ })
+ })
+ .collect();
+ for handle in handles {
+ handle.join().expect("thread panicked")?;
+ }
+
+ pool.close();
+ Ok(())
+}
+```
-// test the latency of innsert tablets,caution:no data will be inserted, only for test latency
-TSStatus testInsertTablets(1:TSInsertTabletsReq req);
+## 5. TLS & RPC compression
-// test the latency of innsert record,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecord(1:TSInsertRecordReq req);
+**RPC compression** (the Thrift compact protocol) must match the server setting `dn_rpc_thrift_compression_enable` (default `false`):
-// test the latency of innsert record in string format,caution:no data will be inserted, only for test latency
-TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
+```rust
+let config = SessionConfig { enable_rpc_compression: true, ..Default::default() };
+```
-// test the latency of innsert records,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecords(1:TSInsertRecordsReq req);
+**TLS** is behind the `tls` cargo feature:
-// test the latency of innsert records of one device,caution:no data will be inserted, only for test latency
-TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
-// test the latency of innsert records in string formate,caution:no data will be inserted, only for test latency
-TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
+```rust
+let config = SessionConfig {
+ use_ssl: true,
+ ca_cert_path: Some("ca.pem".into()), // trust a private CA / self-signed cert
+ accept_invalid_certs: false, // true skips verification (tests only!)
+ domain_override: None, // SNI/validation hostname when connecting by IP
+ ..Default::default()
+};
+```
-// delete data
-TSStatus deleteData(1:TSDeleteDataReq req);
+## 6. Examples
-// execute raw data query
-TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
+Full runnable examples live in the repository's [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) directory:
-// request a statement id from server
-i64 requestStatementId(1:i64 sessionId);
+```sh
+cargo run --example tree_session
+cargo run --example table_session
+cargo run --example session_pool
```
diff --git a/src/zh/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md b/src/zh/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md
new file mode 100644
index 000000000..651fcc478
--- /dev/null
+++ b/src/zh/UserGuide/Master/Table/API/Programming-Rust-Native-API_apache.md
@@ -0,0 +1,133 @@
+
+
+# Rust 原生接口
+
+Apache IoTDB 提供官方 Rust 客户端 SDK:[apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust),基于 Thrift RPC 协议(默认端口 6667)。本文档介绍**表模型**(`TableSession` / `TableSessionPool`,关系型 SQL 方言);树模型另有单独文档。
+
+## 1. 环境要求
+
+- Rust 1.75+
+- Apache IoTDB 2.x — 完整的服务端版本兼容矩阵见 [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md)
+
+## 2. 安装
+
+发布到 crates.io 后:
+
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
+```
+
+在此之前,可使用 git 依赖:
+
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
+
+两种方式的导入名均为 `iotdb_client`。
+
+## 3. 快速上手
+
+```rust
+use iotdb_client::{ColumnCategory, Result, TSDataType, TableSession, Tablet, Value};
+
+fn main() -> Result<()> {
+ let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .username("root")
+ .password("root")
+ .build()?;
+
+ session.execute_non_query("CREATE DATABASE IF NOT EXISTS demo")?;
+ session.execute_non_query("USE demo")?;
+ session.execute_non_query(
+ "CREATE TABLE IF NOT EXISTS sensors (device_id STRING TAG, temperature DOUBLE FIELD)",
+ )?;
+
+ // 列式 tablet 写入。columnCategories 不包含 TIME —— 时间列是隐式的。
+ let mut tablet = Tablet::new_table(
+ "sensors",
+ vec!["device_id".into(), "temperature".into()],
+ vec![TSDataType::String, TSDataType::Double],
+ vec![ColumnCategory::Tag, ColumnCategory::Field],
+ )?;
+ tablet.add_row(
+ 1_720_000_000_000,
+ vec![
+ Some(Value::String("dev-1".into())),
+ Some(Value::Double(21.5)),
+ ],
+ )?;
+ session.insert(&tablet)?;
+
+ // 逐行迭代查询结果;dataset 在 drop 前借用 session。
+ {
+ let mut dataset =
+ session.execute_query("SELECT time, device_id, temperature FROM sensors")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("{:?}", row.values);
+ }
+ }
+
+ session.execute_non_query("DROP DATABASE demo")?;
+ session.close()
+}
+```
+
+## 4. 会话池
+
+`TableSessionPool` 是面向并发场景的线程安全会话池;`acquire()` 返回 RAII guard,drop 时自动将会话归还池中。可参考可运行示例 [`session_pool`](https://github.com/apache/iotdb-client-rust/blob/main/examples/session_pool.rs)。
+
+## 5. TLS 与 RPC 压缩
+
+**RPC 压缩**(即 Thrift compact 协议)必须与服务端配置 `dn_rpc_thrift_compression_enable`(默认 `false`)保持一致:
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .enable_rpc_compression(true)
+ .build()?;
+```
+
+**TLS** 通过 `tls` cargo feature 启用:
+
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .use_ssl(true)
+ .ca_cert_path("ca.pem")
+ .build()?;
+```
+
+## 6. 示例
+
+完整可运行示例见仓库 [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) 目录:
+
+```sh
+cargo run --example table_session
+cargo run --example session_pool
+```
diff --git a/src/zh/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md b/src/zh/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
index 32de0b425..36ee6c95d 100644
--- a/src/zh/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
+++ b/src/zh/UserGuide/Master/Tree/API/Programming-Rust-Native-API.md
@@ -19,182 +19,149 @@
-->
+# Rust 原生接口
-# Rust
+Apache IoTDB 提供官方 Rust 客户端 SDK:[apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust)。它基于 Thrift RPC 协议(默认端口 6667),同时支持 IoTDB 的两种数据模型:
-IoTDB 使用 Thrift 作为跨语言的 RPC 框架,因此可以通过 Thrift 提供的接口来实现对 IoTDB 的访问。本文档将介绍如何生成可访问 IoTDB 的原生 Rust 接口。
+- **树模型** — `Session` / `SessionPool`:设备/时间序列路径(`root.sg.d1.s1`),本文档主要介绍此模型
+- **表模型** — `TableSession` / `TableSessionPool`:关系型 SQL 方言
+## 1. 环境要求
-## 1. 依赖
+- Rust 1.75+
+- Apache IoTDB 2.x — 完整的服务端版本兼容矩阵见 [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md)
- * JDK >= 1.8
- * Rust >= 1.0.0
- * thrift 0.14.1
- * Linux、Macos 或其他类 unix 系统
- * Windows+bash (下载 IoTDB Go client 需要 git ,通过 WSL、cygwin、Git Bash 任意一种方式均可)
+## 2. 安装
-必须安装 thrift(0.14.1 或更高版本)才能将 thrift 文件编译为 Rust 代码。下面是官方的安装教程,最终,您应该得到一个 thrift 可执行文件。
+发布到 crates.io 后:
-```
-http://thrift.apache.org/docs/install/
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
```
+在此之前,可使用 git 依赖:
-## 2. 编译 thrift 库,生成 Rust 原生接口
-
-1. 在 IoTDB 源代码文件夹的根目录中找到 pom.xml 文件。
-2. 打开 pom.xml 文件,找到以下内容:
-
-```xml
-
- generate-thrift-sources-java
- generate-sources
-
- compile
-
-
- java
- ${thrift.exec.absolute.path}
- ${basedir}/src/main/thrift
-
-
-```
-3. 参考该设置,在 pom.xml 文件中添加以下内容,用来生成 Rust 的原生接口:
-
-```xml
-
- generate-thrift-sources-rust
- generate-sources
-
- compile
-
-
- rs
- ${thrift.exec.absolute.path}
- ${basedir}/src/main/thrift
- **/common.thrift,**/client.thrift
- ${project.build.directory}/generated-sources-rust
-
-
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
```
-4. 在 IoTDB 源代码文件夹的根目录下,运行`mvn clean generate-sources`,
-
-这个指令将自动删除`iotdb/iotdb-protocol/thrift/target` 和 `iotdb/iotdb-protocol/thrift-commons/target`中的文件,并使用新生成的 thrift 文件重新填充该文件夹。
-
-这个文件夹在 git 中会被忽略,并且**永远不应该被推到 git 中!**
-
-**注意**不要将`iotdb/iotdb-protocol/thrift/target` 和 `iotdb/iotdb-protocol/thrift-commons/target`上传到 git 仓库中 !
-
-## 3. 使用 Rust 原生接口
-
-将 `iotdb/iotdb-protocol/thrift/target/generated-sources-rust/` 和 `iotdb/iotdb-protocol/thrift-commons/target/generated-sources-rust/` 中的文件复制到您的项目中,即可使用。
-
-## 4. 支持的 rpc 接口
-
+两种方式的导入名均为 `iotdb_client`。
+
+## 3. 快速上手
+
+```rust
+use iotdb_client::{Result, Session, SessionConfig, TSDataType, Tablet, Value};
+
+fn main() -> Result<()> {
+ let config = SessionConfig::default().with_node_urls(&["127.0.0.1:6667"])?;
+ let mut session = Session::new(config);
+ session.open()?;
+
+ session.execute_non_query("CREATE DATABASE root.demo")?;
+ session.execute_non_query(
+ "CREATE TIMESERIES root.demo.d1.temperature WITH DATATYPE=DOUBLE, ENCODING=PLAIN",
+ )?;
+
+ // 通过列式 tablet 批量写入(允许 null)。
+ let mut tablet = Tablet::new(
+ "root.demo.d1",
+ vec!["temperature".into()],
+ vec![TSDataType::Double],
+ )?;
+ tablet.add_row(1_720_000_000_000, vec![Some(Value::Double(21.5))])?;
+ tablet.add_row(1_720_000_001_000, vec![None])?; // null 单元格
+ session.insert_tablet(&tablet)?;
+
+ // 或通过 insertRecord 写入单行(还提供 aligned 变体以及
+ // 多行的 insert_records / insert_records_of_one_device)。
+ session.insert_record(
+ "root.demo.d1",
+ 1_720_000_002_000,
+ vec!["temperature".into()],
+ &[Value::Double(22.0)],
+ false, // is_aligned
+ )?;
+
+ // 逐行迭代查询结果;dataset 在 drop 前借用 session。
+ {
+ let mut dataset = session.execute_query("SELECT temperature FROM root.demo.d1")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("ts={:?} values={:?}", row.timestamp, row.values);
+ }
+ }
+
+ session.execute_non_query("DELETE DATABASE root.demo")?;
+ session.close()
+}
```
-// 打开一个 session
-TSOpenSessionResp openSession(1:TSOpenSessionReq req);
-
-// 关闭一个 session
-TSStatus closeSession(1:TSCloseSessionReq req);
-
-// 执行一条 SQL 语句
-TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
-
-// 批量执行 SQL 语句
-TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
-
-// 执行查询 SQL 语句
-TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
-
-// 执行插入、删除 SQL 语句
-TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
-
-// 向服务器取下一批查询结果
-TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
-
-// 获取元数据
-TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
-
-// 取消某次查询操作
-TSStatus cancelOperation(1:TSCancelOperationReq req);
-
-// 关闭查询操作数据集,释放资源
-TSStatus closeOperation(1:TSCloseOperationReq req);
-
-// 获取时区信息
-TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
-// 设置时区
-TSStatus setTimeZone(1:TSSetTimeZoneReq req);
-
-// 获取服务端配置
-ServerProperties getProperties();
-
-// 设置 database
-TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
-
-// 创建时间序列
-TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
-
-// 创建多条时间序列
-TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
-
-// 删除时间序列
-TSStatus deleteTimeseries(1:i64 sessionId, 2:list path)
-
-// 删除 database
-TSStatus deleteStorageGroups(1:i64 sessionId, 2:list storageGroup);
-
-// 按行插入数据
-TSStatus insertRecord(1:TSInsertRecordReq req);
-
-// 按 String 格式插入一条数据
-TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
-
-// 按列插入数据
-TSStatus insertTablet(1:TSInsertTabletReq req);
-
-// 按列批量插入数据
-TSStatus insertTablets(1:TSInsertTabletsReq req);
-
-// 按行批量插入数据
-TSStatus insertRecords(1:TSInsertRecordsReq req);
-
-// 按行批量插入同属于某个设备的数据
-TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
-
-// 按 String 格式批量按行插入数据
-TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
-
-// 测试按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertTablet(1:TSInsertTabletReq req);
+## 4. 会话池
+
+`SessionPool` 是线程安全的会话池,适用于并发场景。`acquire()` 返回 RAII guard,drop 时自动将会话归还池中:
+
+```rust
+use std::sync::Arc;
+use iotdb_client::{Result, SessionPool, SessionPoolConfig};
+
+fn main() -> Result<()> {
+ let config = SessionPoolConfig {
+ max_size: 4,
+ ..SessionPoolConfig::default()
+ }
+ .with_node_urls(&["127.0.0.1:6667"])?;
+ let pool = Arc::new(SessionPool::new(config)?);
+
+ let handles: Vec<_> = (0..4)
+ .map(|_| {
+ let pool = Arc::clone(&pool);
+ std::thread::spawn(move || -> Result<()> {
+ let mut session = pool.acquire()?;
+ session.execute_non_query("SHOW DATABASES")?;
+ Ok(())
+ })
+ })
+ .collect();
+ for handle in handles {
+ handle.join().expect("thread panicked")?;
+ }
+
+ pool.close();
+ Ok(())
+}
+```
-// 测试批量按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertTablets(1:TSInsertTabletsReq req);
+## 5. TLS 与 RPC 压缩
-// 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecord(1:TSInsertRecordReq req);
+**RPC 压缩**(即 Thrift compact 协议)必须与服务端配置 `dn_rpc_thrift_compression_enable`(默认 `false`)保持一致:
-// 测试按 String 格式按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
+```rust
+let config = SessionConfig { enable_rpc_compression: true, ..Default::default() };
+```
-// 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecords(1:TSInsertRecordsReq req);
+**TLS** 通过 `tls` cargo feature 启用:
-// 测试按行批量插入同属于某个设备的数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
-// 测试按 String 格式批量按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
+```rust
+let config = SessionConfig {
+ use_ssl: true,
+ ca_cert_path: Some("ca.pem".into()), // 信任私有 CA / 自签名证书
+ accept_invalid_certs: false, // true 跳过证书校验(仅限测试!)
+ domain_override: None, // 按 IP 连接时指定 SNI/校验主机名
+ ..Default::default()
+};
+```
-// 删除数据
-TSStatus deleteData(1:TSDeleteDataReq req);
+## 6. 示例
-// 执行原始数据查询
-TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
+完整可运行示例见仓库 [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) 目录:
-// 向服务器申请一个查询语句 ID
-i64 requestStatementId(1:i64 sessionId);
+```sh
+cargo run --example tree_session
+cargo run --example table_session
+cargo run --example session_pool
```
diff --git a/src/zh/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md b/src/zh/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md
new file mode 100644
index 000000000..651fcc478
--- /dev/null
+++ b/src/zh/UserGuide/latest-Table/API/Programming-Rust-Native-API_apache.md
@@ -0,0 +1,133 @@
+
+
+# Rust 原生接口
+
+Apache IoTDB 提供官方 Rust 客户端 SDK:[apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust),基于 Thrift RPC 协议(默认端口 6667)。本文档介绍**表模型**(`TableSession` / `TableSessionPool`,关系型 SQL 方言);树模型另有单独文档。
+
+## 1. 环境要求
+
+- Rust 1.75+
+- Apache IoTDB 2.x — 完整的服务端版本兼容矩阵见 [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md)
+
+## 2. 安装
+
+发布到 crates.io 后:
+
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
+```
+
+在此之前,可使用 git 依赖:
+
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
+```
+
+两种方式的导入名均为 `iotdb_client`。
+
+## 3. 快速上手
+
+```rust
+use iotdb_client::{ColumnCategory, Result, TSDataType, TableSession, Tablet, Value};
+
+fn main() -> Result<()> {
+ let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .username("root")
+ .password("root")
+ .build()?;
+
+ session.execute_non_query("CREATE DATABASE IF NOT EXISTS demo")?;
+ session.execute_non_query("USE demo")?;
+ session.execute_non_query(
+ "CREATE TABLE IF NOT EXISTS sensors (device_id STRING TAG, temperature DOUBLE FIELD)",
+ )?;
+
+ // 列式 tablet 写入。columnCategories 不包含 TIME —— 时间列是隐式的。
+ let mut tablet = Tablet::new_table(
+ "sensors",
+ vec!["device_id".into(), "temperature".into()],
+ vec![TSDataType::String, TSDataType::Double],
+ vec![ColumnCategory::Tag, ColumnCategory::Field],
+ )?;
+ tablet.add_row(
+ 1_720_000_000_000,
+ vec![
+ Some(Value::String("dev-1".into())),
+ Some(Value::Double(21.5)),
+ ],
+ )?;
+ session.insert(&tablet)?;
+
+ // 逐行迭代查询结果;dataset 在 drop 前借用 session。
+ {
+ let mut dataset =
+ session.execute_query("SELECT time, device_id, temperature FROM sensors")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("{:?}", row.values);
+ }
+ }
+
+ session.execute_non_query("DROP DATABASE demo")?;
+ session.close()
+}
+```
+
+## 4. 会话池
+
+`TableSessionPool` 是面向并发场景的线程安全会话池;`acquire()` 返回 RAII guard,drop 时自动将会话归还池中。可参考可运行示例 [`session_pool`](https://github.com/apache/iotdb-client-rust/blob/main/examples/session_pool.rs)。
+
+## 5. TLS 与 RPC 压缩
+
+**RPC 压缩**(即 Thrift compact 协议)必须与服务端配置 `dn_rpc_thrift_compression_enable`(默认 `false`)保持一致:
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .enable_rpc_compression(true)
+ .build()?;
+```
+
+**TLS** 通过 `tls` cargo feature 启用:
+
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
+
+```rust
+let mut session = TableSession::builder()
+ .node_urls(&["127.0.0.1:6667"])?
+ .use_ssl(true)
+ .ca_cert_path("ca.pem")
+ .build()?;
+```
+
+## 6. 示例
+
+完整可运行示例见仓库 [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) 目录:
+
+```sh
+cargo run --example table_session
+cargo run --example session_pool
+```
diff --git a/src/zh/UserGuide/latest/API/Programming-Rust-Native-API.md b/src/zh/UserGuide/latest/API/Programming-Rust-Native-API.md
index 32de0b425..36ee6c95d 100644
--- a/src/zh/UserGuide/latest/API/Programming-Rust-Native-API.md
+++ b/src/zh/UserGuide/latest/API/Programming-Rust-Native-API.md
@@ -19,182 +19,149 @@
-->
+# Rust 原生接口
-# Rust
+Apache IoTDB 提供官方 Rust 客户端 SDK:[apache/iotdb-client-rust](https://github.com/apache/iotdb-client-rust)。它基于 Thrift RPC 协议(默认端口 6667),同时支持 IoTDB 的两种数据模型:
-IoTDB 使用 Thrift 作为跨语言的 RPC 框架,因此可以通过 Thrift 提供的接口来实现对 IoTDB 的访问。本文档将介绍如何生成可访问 IoTDB 的原生 Rust 接口。
+- **树模型** — `Session` / `SessionPool`:设备/时间序列路径(`root.sg.d1.s1`),本文档主要介绍此模型
+- **表模型** — `TableSession` / `TableSessionPool`:关系型 SQL 方言
+## 1. 环境要求
-## 1. 依赖
+- Rust 1.75+
+- Apache IoTDB 2.x — 完整的服务端版本兼容矩阵见 [COMPATIBILITY.md](https://github.com/apache/iotdb-client-rust/blob/main/COMPATIBILITY.md)
- * JDK >= 1.8
- * Rust >= 1.0.0
- * thrift 0.14.1
- * Linux、Macos 或其他类 unix 系统
- * Windows+bash (下载 IoTDB Go client 需要 git ,通过 WSL、cygwin、Git Bash 任意一种方式均可)
+## 2. 安装
-必须安装 thrift(0.14.1 或更高版本)才能将 thrift 文件编译为 Rust 代码。下面是官方的安装教程,最终,您应该得到一个 thrift 可执行文件。
+发布到 crates.io 后:
-```
-http://thrift.apache.org/docs/install/
+```toml
+[dependencies]
+iotdb-client-rust = "0.1"
```
+在此之前,可使用 git 依赖:
-## 2. 编译 thrift 库,生成 Rust 原生接口
-
-1. 在 IoTDB 源代码文件夹的根目录中找到 pom.xml 文件。
-2. 打开 pom.xml 文件,找到以下内容:
-
-```xml
-
- generate-thrift-sources-java
- generate-sources
-
- compile
-
-
- java
- ${thrift.exec.absolute.path}
- ${basedir}/src/main/thrift
-
-
-```
-3. 参考该设置,在 pom.xml 文件中添加以下内容,用来生成 Rust 的原生接口:
-
-```xml
-
- generate-thrift-sources-rust
- generate-sources
-
- compile
-
-
- rs
- ${thrift.exec.absolute.path}
- ${basedir}/src/main/thrift
- **/common.thrift,**/client.thrift
- ${project.build.directory}/generated-sources-rust
-
-
+```toml
+[dependencies]
+iotdb-client = { git = "https://github.com/apache/iotdb-client-rust" }
```
-4. 在 IoTDB 源代码文件夹的根目录下,运行`mvn clean generate-sources`,
-
-这个指令将自动删除`iotdb/iotdb-protocol/thrift/target` 和 `iotdb/iotdb-protocol/thrift-commons/target`中的文件,并使用新生成的 thrift 文件重新填充该文件夹。
-
-这个文件夹在 git 中会被忽略,并且**永远不应该被推到 git 中!**
-
-**注意**不要将`iotdb/iotdb-protocol/thrift/target` 和 `iotdb/iotdb-protocol/thrift-commons/target`上传到 git 仓库中 !
-
-## 3. 使用 Rust 原生接口
-
-将 `iotdb/iotdb-protocol/thrift/target/generated-sources-rust/` 和 `iotdb/iotdb-protocol/thrift-commons/target/generated-sources-rust/` 中的文件复制到您的项目中,即可使用。
-
-## 4. 支持的 rpc 接口
-
+两种方式的导入名均为 `iotdb_client`。
+
+## 3. 快速上手
+
+```rust
+use iotdb_client::{Result, Session, SessionConfig, TSDataType, Tablet, Value};
+
+fn main() -> Result<()> {
+ let config = SessionConfig::default().with_node_urls(&["127.0.0.1:6667"])?;
+ let mut session = Session::new(config);
+ session.open()?;
+
+ session.execute_non_query("CREATE DATABASE root.demo")?;
+ session.execute_non_query(
+ "CREATE TIMESERIES root.demo.d1.temperature WITH DATATYPE=DOUBLE, ENCODING=PLAIN",
+ )?;
+
+ // 通过列式 tablet 批量写入(允许 null)。
+ let mut tablet = Tablet::new(
+ "root.demo.d1",
+ vec!["temperature".into()],
+ vec![TSDataType::Double],
+ )?;
+ tablet.add_row(1_720_000_000_000, vec![Some(Value::Double(21.5))])?;
+ tablet.add_row(1_720_000_001_000, vec![None])?; // null 单元格
+ session.insert_tablet(&tablet)?;
+
+ // 或通过 insertRecord 写入单行(还提供 aligned 变体以及
+ // 多行的 insert_records / insert_records_of_one_device)。
+ session.insert_record(
+ "root.demo.d1",
+ 1_720_000_002_000,
+ vec!["temperature".into()],
+ &[Value::Double(22.0)],
+ false, // is_aligned
+ )?;
+
+ // 逐行迭代查询结果;dataset 在 drop 前借用 session。
+ {
+ let mut dataset = session.execute_query("SELECT temperature FROM root.demo.d1")?;
+ while let Some(row) = dataset.next_row()? {
+ println!("ts={:?} values={:?}", row.timestamp, row.values);
+ }
+ }
+
+ session.execute_non_query("DELETE DATABASE root.demo")?;
+ session.close()
+}
```
-// 打开一个 session
-TSOpenSessionResp openSession(1:TSOpenSessionReq req);
-
-// 关闭一个 session
-TSStatus closeSession(1:TSCloseSessionReq req);
-
-// 执行一条 SQL 语句
-TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
-
-// 批量执行 SQL 语句
-TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
-
-// 执行查询 SQL 语句
-TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
-
-// 执行插入、删除 SQL 语句
-TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
-
-// 向服务器取下一批查询结果
-TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
-
-// 获取元数据
-TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
-
-// 取消某次查询操作
-TSStatus cancelOperation(1:TSCancelOperationReq req);
-
-// 关闭查询操作数据集,释放资源
-TSStatus closeOperation(1:TSCloseOperationReq req);
-
-// 获取时区信息
-TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
-// 设置时区
-TSStatus setTimeZone(1:TSSetTimeZoneReq req);
-
-// 获取服务端配置
-ServerProperties getProperties();
-
-// 设置 database
-TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
-
-// 创建时间序列
-TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
-
-// 创建多条时间序列
-TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
-
-// 删除时间序列
-TSStatus deleteTimeseries(1:i64 sessionId, 2:list path)
-
-// 删除 database
-TSStatus deleteStorageGroups(1:i64 sessionId, 2:list storageGroup);
-
-// 按行插入数据
-TSStatus insertRecord(1:TSInsertRecordReq req);
-
-// 按 String 格式插入一条数据
-TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
-
-// 按列插入数据
-TSStatus insertTablet(1:TSInsertTabletReq req);
-
-// 按列批量插入数据
-TSStatus insertTablets(1:TSInsertTabletsReq req);
-
-// 按行批量插入数据
-TSStatus insertRecords(1:TSInsertRecordsReq req);
-
-// 按行批量插入同属于某个设备的数据
-TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
-
-// 按 String 格式批量按行插入数据
-TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
-
-// 测试按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertTablet(1:TSInsertTabletReq req);
+## 4. 会话池
+
+`SessionPool` 是线程安全的会话池,适用于并发场景。`acquire()` 返回 RAII guard,drop 时自动将会话归还池中:
+
+```rust
+use std::sync::Arc;
+use iotdb_client::{Result, SessionPool, SessionPoolConfig};
+
+fn main() -> Result<()> {
+ let config = SessionPoolConfig {
+ max_size: 4,
+ ..SessionPoolConfig::default()
+ }
+ .with_node_urls(&["127.0.0.1:6667"])?;
+ let pool = Arc::new(SessionPool::new(config)?);
+
+ let handles: Vec<_> = (0..4)
+ .map(|_| {
+ let pool = Arc::clone(&pool);
+ std::thread::spawn(move || -> Result<()> {
+ let mut session = pool.acquire()?;
+ session.execute_non_query("SHOW DATABASES")?;
+ Ok(())
+ })
+ })
+ .collect();
+ for handle in handles {
+ handle.join().expect("thread panicked")?;
+ }
+
+ pool.close();
+ Ok(())
+}
+```
-// 测试批量按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertTablets(1:TSInsertTabletsReq req);
+## 5. TLS 与 RPC 压缩
-// 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecord(1:TSInsertRecordReq req);
+**RPC 压缩**(即 Thrift compact 协议)必须与服务端配置 `dn_rpc_thrift_compression_enable`(默认 `false`)保持一致:
-// 测试按 String 格式按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
+```rust
+let config = SessionConfig { enable_rpc_compression: true, ..Default::default() };
+```
-// 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecords(1:TSInsertRecordsReq req);
+**TLS** 通过 `tls` cargo feature 启用:
-// 测试按行批量插入同属于某个设备的数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
+```toml
+iotdb-client-rust = { version = "0.1", features = ["tls"] }
+```
-// 测试按 String 格式批量按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
-TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
+```rust
+let config = SessionConfig {
+ use_ssl: true,
+ ca_cert_path: Some("ca.pem".into()), // 信任私有 CA / 自签名证书
+ accept_invalid_certs: false, // true 跳过证书校验(仅限测试!)
+ domain_override: None, // 按 IP 连接时指定 SNI/校验主机名
+ ..Default::default()
+};
+```
-// 删除数据
-TSStatus deleteData(1:TSDeleteDataReq req);
+## 6. 示例
-// 执行原始数据查询
-TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
+完整可运行示例见仓库 [`examples/`](https://github.com/apache/iotdb-client-rust/tree/main/examples) 目录:
-// 向服务器申请一个查询语句 ID
-i64 requestStatementId(1:i64 sessionId);
+```sh
+cargo run --example tree_session
+cargo run --example table_session
+cargo run --example session_pool
```