< 返回版块

LH-ming 发表于 2022-10-19 22:03

Tags:sqlx,trait

大神们,帮帮忙!

  • 这是一个sqlx的问题。sqlx查询完需要的数据,映射到自己定义的结构体。栗子
pub async fn query_param<'a, T,P>(pool:&Pool<MySql>,sql:&'a str,params:Option<P>) ->Result<Vec<T>> 
where 
    //T是自己定义的映射的结构体
    T:for<'r> sqlx::FromRow<'r, sqlx::mysql::MySqlRow> + std::marker::Unpin + std::marker::Send,
    P:'a+ Send + Encode<'a, MySql> + Type<MySql> + std::marker::Sync,
                                                  
{
    let data:Vec<T>=sqlx::query_as(sql)
        .bind(params)        
        .fetch_all(pool)
        .await.map_err(AppError::from)?;
    Ok(data)   
}
//这是映射的结构体(基本类型都实现了相应的trait(i32,String等等))
//这就是上面的T
#[derive(Debug, FromRow)]
pub struct Category{
    pub id:i32,
    pub name:String,
    pub is_del:bool,
}
  • 问题来了,我想返回TopicView这个结构体,但是sqlx没有给time::SystemTime这个类型实现相应的trait。孩子不会了,前辈们,教教孩子怎么实现相应的trait。trait在下边。
#[derive(FromRow)]
pub struct TopicView{
    pub id:i64,
    pub title:String,
    pub summary:String,
    pub hit: i32,
    //这里应该是dateline:time::SystemTime。但是SystemTime没有实现相应的trait。我把它拿出去实现trait
    pub dateline:SysTime,
    pub category_id:i32,
    pub is_del:bool,
    pub name:String,
}


pub struct SysTime(time::SystemTime);
impl Decode<'_,MySql> for SysTime{
    fn decode<'r>(value: <MySql as sqlx::database::HasValueRef<'r>>::ValueRef) -> Result<Self, sqlx::error::BoxDynError> {
        todo!()
    }
}

impl Type<MySql> for SysTime{
    fn type_info() -> <MySql as sqlx::Database>::TypeInfo {
        todo!()
    }
}

天冷了,朋友们记得添衣。

评论区

写评论
作者 LH-ming 2022-10-20 23:06

就用chrono吧。来回取数据挺方便的。我这sqlx的版本感人,哈哈。感谢指点。

sqlx = { version = "0.5.6", features = [ "runtime-tokio-rustls" ,"mysql","chrono",] }

谢谢!

👇
shanliu:

         sqlx::query(&format!(
            "select * from ({}) as t",
            sqls.join(") union all (")
        ))
        .try_map(
            |row: sqlx::mysql::MySqlRow|{
               //todo ...
            },
        )
        .fetch_all(&self.db)
        .await?
作者 LH-ming 2022-10-20 23:00

感谢推荐,用chrono了。谢谢

--
👇
Grobycn: 推荐用 chrono

Grobycn 2022-10-20 09:36

推荐用 chrono

github.com/shanliu/lsys 2022-10-19 23:22
         sqlx::query(&format!(
            "select * from ({}) as t",
            sqls.join(") union all (")
        ))
        .try_map(
            |row: sqlx::mysql::MySqlRow|{
               //todo ...
            },
        )
        .fetch_all(&self.db)
        .await?
1 共 4 条评论, 1 页