# Databend Driver
Databend unified SQL client for RestAPI and FlightSQL
[](https://crates.io/crates/databend-driver)

## usage
### exec
```rust
use databend_driver::Client;
let dsn = "databend://root:@localhost:8000/default?sslmode=disable".to_string();
let client = Client::new(dsn);
let conn = client.get_conn().await.unwrap();
let sql_create = "CREATE TABLE books (
title VARCHAR,
author VARCHAR,
date Date
);";
conn.exec(sql_create).await.unwrap();
let sql_insert = "INSERT INTO books VALUES ('The Little Prince', 'Antoine de Saint-Exupéry', '1943-04-06');";
conn.exec(sql_insert).await.unwrap();
```
### query row
```rust
let row = conn.query_row("SELECT * FROM books;").await.unwrap();
let (title,author,date): (String,String,i32) = row.unwrap().try_into().unwrap();
println!("{} {} {}", title, author, date);
```
### query iter
```rust
let mut rows = conn.query_iter("SELECT * FROM books;").await.unwrap();
while let Some(row) = rows.next().await {
let (title,author,date): (String,String,chrono::NaiveDate) = row.unwrap().try_into().unwrap();
println!("{} {} {}", title, author, date);
}
```
## Type Mapping
[Databend Types](https://docs.databend.com/sql/sql-reference/data-types/)
### General Data Types
| `BOOLEAN` | `bool` |
| `TINYINT` | `i8`,`u8` |
| `SMALLINT` | `i16`,`u16` |
| `INT` | `i32`,`u32` |
| `BIGINT` | `i64`,`u64` |
| `FLOAT` | `f32` |
| `DOUBLE` | `f64` |
| `DECIMAL` | `String` |
| `DATE` | `chrono::NaiveDate` |
| `TIMESTAMP` | `chrono::NaiveDateTime` |
| `VARCHAR` | `String` |
| `BINARY` | `Vec<u8>` |
### Semi-Structured Data Types
| `ARRAY[T]` | `Vec<T>` |
| `TUPLE[T, U]` | `(T, U)` |
| `MAP[K, V]` | `HashMap<K, V>` |
| `VARIANT` | `String` |
| `BITMAP` | `String` |
| `GEOMETRY` | `String` |
Note: `VARIANT` is a json encoded string. Example:
```sql
CREATE TABLE example (
data VARIANT
);
INSERT INTO example VALUES ('{"a": 1, "b": "hello"}');
```
```rust
let row = conn.query_row("SELECT * FROM example limit 1;").await.unwrap();
let (data,): (String,) = row.unwrap().try_into().unwrap();
let value: serde_json::Value = serde_json::from_str(&data).unwrap();
println!("{:?}", value);
```