Rust连接Clickhouse

Clickhouse兼容Rust的官网有三种方式,以下方式是唯一可以调通的,希望对大家有帮助

use core::panic;

use actix_http::Request;
use chrono::Utc;
use futures::StreamExt;
use klickhouse::*;
use std::collections::HashMap;
use std::collections::HashSet;
use actix_web::*;
use serde::{Deserialize, Serialize};
use serde_json::json;
use tracing::{error, info};
use crate::error::{RecloudError, StandardResp};
use crate::server;

use super::super::AppState;

use klickhouse::{Client, Row};
// use clickhouse::{Client, Row};

pub async fn query<T: Row>(sql: &str, client: &Client) -> anyhow::Result<Option<Vec<T>>> {
    let mut result = Vec::new();
    let mut rows = client.query::<T>(sql).await?;
    while let Some(row) = rows.next().await {
        result.push(row?);
    }
    if result.len() == 0 {
        return Ok(None);
    }
    Ok(Some(result))
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Resp {
    pub data: Vec<Option<Vec<ChRes>>>,
}

#[derive(Debug, Serialize, Deserialize, Row, Clone)]
pub struct ChRes {
    pub carno: String,
    pub mile: f64,
}

#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CkData {
    car_no_list: Vec<String>,
    durations: Vec<Vec<String>>,
}



#[post("/get_ck_info")]
pub async fn get_ck_info(
    // data: web::Data<AppState>,
    request: web::Json<CkData>,
) -> std::result::Result<HttpResponse, RecloudError> {
    let tmp = (1, "", true);
    println!("{:?}", tmp.1);

    info!("inside get_ck_info");
    let client = Client::connect("172.16.xxx.xx:9000", ClientOptions::default())
        .await
        .unwrap();


    let car_no_list = request
        .car_no_list
        .iter()
        .map(|carno: &String| format!("'{}'", carno))
        .collect::<Vec<_>>()
        .join(",");

    let mut res_map: HashMap<String, Vec<f64>> = HashMap::new();
    let carno = request.car_no_list[0].clone();
    let mut res_list: Vec<f64> = vec![];

    for duration in &request.durations {
        let sql = format!(
            r#"select carno,
                    max(acc_power_left) - min(acc_power_left) as mile
                from table
                where carno in ({}) 
                and car_time >= '{}'
                and car_time <= '{}'
                group by carno
                "#,
            car_no_list, duration[0], duration[1]
        );
    
        let res = query::<ChRes>(&sql, &client).await;
        
        match res {
            Ok(Some(vec)) => {
                info!("{:?}", vec);
                res_list.extend(vec.iter().map(|r| r.mile.clone()).collect::<Vec<f64>>());
            }
            Ok(None) => {
                println!("Option is None");
            }
            Err(e) => return Err(RecloudError::QueryError),
        }
    }
    res_map.insert(carno.clone(), res_list);
    Ok(HttpResponse::Ok().json(StandardResp::success(Some(json!(res_map)))))
}



pub fn get_ck_info_api() -> Scope {
    web::scope("").service(get_ck_info)
}

### 回答1: 你好! 使用 Rust 连接 MySQL 数据库可以使用第三方库 `mysql`。 首先,在你的 `Cargo.toml` 文件中添加下面这行代码,将 `mysql` 库添加到你的项目中: ``` [dependencies] mysql = "*" ``` 然后,在你的 Rust 代码中导入 `mysql` 库: ``` extern crate mysql; ``` 接下来,使用以下代码来连接到 MySQL 数据库: ``` use mysql as my; let pool = my::Pool::new("mysql://root:password@localhost:3306").unwrap(); ``` 这里,`root` 是 MySQL 用户名,`password` 是 MySQL 密码,`localhost` 是 MySQL 服务器的地址,`3306` 是 MySQL 服务器的端口。 连接成功后,你就可以使用 `pool` 对象来执行 SQL 查询了。例如,你可以使用以下代码来执行一个 SELECT 查询: ``` let selected_rows = pool.prep_exec("SELECT * FROM my_table", ()).map(|result| { // 对每一行的处理 result.map(|x| x.unwrap()).collect() }).unwrap(); ``` 你也可以使用以下代码来执行一个 INSERT 操作: ``` pool.prep_exec("INSERT INTO my_table (id, name) VALUES (1, 'John')", ()).unwrap(); ``` 有关如何使用 `mysql` 库的更多信息,你可以参考它的文档:https://docs.rs/mysql/。 ### 回答2: Rust是一种系统级编程语言,目前也可以用于Web开发连接MySQL数据库是一个常见的需求,在Rust中我们可以使用第三方库来实现这个功能。 在Rust中,我们可以使用一些第三方的crates(包)来连接MySQL数据库。其中比较常用的有mysql和tokio-mysql。 mysql是一个Rust的MySQL客户端库,可以通过它在Rust连接和操作MySQL数据库。它提供了一系列的API来执行增删改查等操作。使用mysql库连接MySQL数据库需要先在项目的Cargo.toml文件中添加对mysql库的依赖声明,然后通过相关的API来连接并操作MySQL数据库。 tokio-mysql是基于tokio异步运行时的MySQL客户端库。tokio是一个基于异步编程的运行时库,可以帮助我们在Rust中轻松实现异步操作。tokio-mysql库提供了基于tokio框架的MySQL连接和操作功能,适用于异步编程的项目。使用tokio-mysql连接MySQL数据库同样需要在项目的Cargo.toml文件中添加对tokio-mysql库的依赖声明,并通过tokio的异步框架来进行操作。 根据具体的开发需求和项目特点,我们可以选择合适的库来连接MySQL数据库。具体操作步骤可以参考相关库的文档或示例代码,这样我们就可以在Rust中成功连接MySQL数据库并进行相应的操作了。 ### 回答3: 要使用 Rust 连接 MySQL,可以使用第三方库 "mysql"。首先,需要在项目的 Cargo.toml 文件中添加库的依赖: ```toml [dependencies] mysql = "*" ``` 然后,在 Rust 代码中引入库,并连接到 MySQL 数据库: ```rust use mysql::*; fn main() { // 创建连接池 let pool = Pool::new( Opts::from_url("mysql://username:password@localhost:3306/database_name") ).unwrap(); // 从连接池中获取连接 let mut conn = pool.get_conn().unwrap(); // 执行查询 let query = "SELECT * FROM table_name"; let result: Vec<Row> = conn.query(query).unwrap(); // 处理查询结果 for row in result { let id: i32 = row.get("id").unwrap(); let name: String = row.get("name").unwrap(); println!("ID: {}, Name: {}", id, name); } } ``` 在上述代码中,我们首先创建了一个连接池,然后从该连接池中获取一个连接。接下来,我们执行了一个查询,并将结果存储在 result 变量中。最后,我们遍历结果并获取每一行的 id 和 name 字段。 当然,以上只是一个简单的示例,实际使用中可能需要更多的错误处理、参数绑定等操作。可以参考 "mysql" 库的文档以了解更多详细用法和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值