< 返回版块

shanliu 发表于 2022-07-08 23:23

#[derive(sqlx::FromRow)]
struct Ma {
    id: u64,
    name: String,
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, sqlx::Error> {
    //sql exec error,how get sql form sqlx::Error?
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>("select * from aa");
    res = res.bind(1);
    res.fetch_one(&executor).await //sql可以这里map 转换err放入去,但每次都手动很不方便
//也不想把 fetch_one fetch_all 等方法外面在封装一层,因为要封装太多
}

评论区

写评论
作者 shanliu 2023-01-24 19:26

每次调用都要写 context 好累赘。。 最后我还是包装macro处理了

--
👇
liusen-adalab: 最近研究了一下 snafu,应该能满足你的需求,可以像 thiserror 一样定义错误类型,同时可以像 anyhow 一样用 context。

#[derive(Debug, Snafu)]
#[snafu(context(suffix(false)))]
enum Error {
    #[snafu(display("failed to execute sql: {sql}, at: {source}"))]
    SqlxError { sql: String, source: sqlx::Error },
}

pub type Result<T, E = Error> = core::result::Result<T, E>;

#[derive(sqlx::FromRow)]
struct Ma {
    id: u64,
    name: String,
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    rrs.fetch_one(&executor).await.context(SqlxError { sql })
}
liusen-adalab 2022-07-15 09:30

最近研究了一下 snafu,应该能满足你的需求,可以像 thiserror 一样定义错误类型,同时可以像 anyhow 一样用 context。

#[derive(Debug, Snafu)]
#[snafu(context(suffix(false)))]
enum Error {
    #[snafu(display("failed to execute sql: {sql}, at: {source}"))]
    SqlxError { sql: String, source: sqlx::Error },
}

pub type Result<T, E = Error> = core::result::Result<T, E>;

#[derive(sqlx::FromRow)]
struct Ma {
    id: u64,
    name: String,
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    rrs.fetch_one(&executor).await.context(SqlxError { sql })
}
作者 shanliu 2022-07-12 22:53

一开始想整个macro,但发现要包好几个请求方法,又不想搞了

--
👇
shanliu: 知道 就是不想每个都map_err转一下 太麻烦了

--
👇
SkyWalker: sqlx::query::QueryAs里有sql字符串。

--
👇
苦瓜小仔: 听起来你想要在 Result::Err 的情况下获取函数内部变量的信息。

那么首先去查 sqlx::Error 有没有包括你需要的东西;

如果没有,你可以自定义错误类型:

enum CutomError {
    Sql(String),
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, CutomError> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    res.fetch_one(&executor).await.map_err(|_| CutomError::Sql(sql.to_owned()))
}

自定义错误类型是枚举还是结构体取决于你想要拿 sql 语句干什么。

如果你连 map_err 都嫌麻烦的话,那就没什么好办法了。Rust 的错误处理和类型设计就是这样。

作者 shanliu 2022-07-12 22:52

知道 就是不想每个都map_err转一下 太麻烦了

--
👇
SkyWalker: sqlx::query::QueryAs里有sql字符串。

--
👇
苦瓜小仔: 听起来你想要在 Result::Err 的情况下获取函数内部变量的信息。

那么首先去查 sqlx::Error 有没有包括你需要的东西;

如果没有,你可以自定义错误类型:

enum CutomError {
    Sql(String),
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, CutomError> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    res.fetch_one(&executor).await.map_err(|_| CutomError::Sql(sql.to_owned()))
}

自定义错误类型是枚举还是结构体取决于你想要拿 sql 语句干什么。

如果你连 map_err 都嫌麻烦的话,那就没什么好办法了。Rust 的错误处理和类型设计就是这样。

作者 shanliu 2022-07-12 22:51

不嫌麻烦就不问了 提问时就说了不想挨个map_err 转换

--
👇
苦瓜小仔: 听起来你想要在 Result::Err 的情况下获取函数内部变量的信息。

那么首先去查 sqlx::Error 有没有包括你需要的东西;

如果没有,你可以自定义错误类型:

enum CutomError {
    Sql(String),
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, CutomError> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    res.fetch_one(&executor).await.map_err(|_| CutomError::Sql(sql.to_owned()))
}

自定义错误类型是枚举还是结构体取决于你想要拿 sql 语句干什么。

如果你连 map_err 都嫌麻烦的话,那就没什么好办法了。Rust 的错误处理和类型设计就是这样。

SkyWalker 2022-07-12 10:20

sqlx::query::QueryAs里有sql字符串。

--
👇
苦瓜小仔: 听起来你想要在 Result::Err 的情况下获取函数内部变量的信息。

那么首先去查 sqlx::Error 有没有包括你需要的东西;

如果没有,你可以自定义错误类型:

enum CutomError {
    Sql(String),
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, CutomError> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    res.fetch_one(&executor).await.map_err(|_| CutomError::Sql(sql.to_owned()))
}

自定义错误类型是枚举还是结构体取决于你想要拿 sql 语句干什么。

如果你连 map_err 都嫌麻烦的话,那就没什么好办法了。Rust 的错误处理和类型设计就是这样。

苦瓜小仔 2022-07-09 00:43

听起来你想要在 Result::Err 的情况下获取函数内部变量的信息。

那么首先去查 sqlx::Error 有没有包括你需要的东西;

如果没有,你可以自定义错误类型:

enum CutomError {
    Sql(String),
}

async fn get_data(executor: sqlx::Pool<sqlx::MySql>) -> Result<Ma, CutomError> {
    let sql = "select * from aa";
    let mut res = sqlx::query_as::<sqlx::MySql, Ma>(sql);
    res = res.bind(1);
    res.fetch_one(&executor).await.map_err(|_| CutomError::Sql(sql.to_owned()))
}

自定义错误类型是枚举还是结构体取决于你想要拿 sql 语句干什么。

如果你连 map_err 都嫌麻烦的话,那就没什么好办法了。Rust 的错误处理和类型设计就是这样。

1 共 7 条评论, 1 页