首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生锈Sqlx手柄插入冲突

生锈Sqlx手柄插入冲突
EN

Stack Overflow用户
提问于 2021-07-13 10:45:52
回答 1查看 2.3K关注 0票数 2

我有一个查询,它将用户的数据插入到数据库中。它工作得很好,但是users表在username上有一个唯一的索引,所以当尝试创建一个用户名已经存在的行时,它会抛出一个错误:

代码语言:javascript
复制
pub async fn create(user: UserRequest, pool: &PgPool) -> anyhow::Result<User> {
   let new_user = sqlx::query_as!(
       User,
       r#"
       INSERT INTO users (first_name, username)
       VALUES ($1, $2)
       RETURNING id, first_name, username
       "#,
       &user.first_name,
       &user.username,
   )
   .fetch_one(&pool.clone())
   .await?;
    
   Ok(User {
       id: new_user.id,
       first_name: new_user.first_name,
       username: new_user.username,
   })
}

&user是一个函数参数,定义为:

代码语言:javascript
复制
pub struct UserRequest {
    pub first_name: String,
    pub username: String,
}

使用此函数的端点使用match检查它是Ok(user)还是其他任何东西,并返回它的响应:

代码语言:javascript
复制
pub async fn create_user(
    user: web::Json<UserRequest>,
    pool: Data<PgPool>,
) -> impl Responder {
    let new_user = User::create(user.into_inner(), pool.get_ref()).await;
    match new_user {
        Ok(user) => HttpResponse::Ok().json(user),
        _ => HttpResponse::BadRequest().body(ERROR_MESSAGE),
    }
}

如果出现错误,因为行试图被复制,我能做些什么来捕捉这种情况呢?实际情况是,当发生这种情况时,我需要返回不同的HTTP状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 05:52:20

您可以使用get_code检查错误代码。

代码语言:javascript
复制
match new_user {
    Ok(user) => HttpResponse::Ok().json(user),
    Err(err) if err.get_code() == "23505" {
    // returns unique constraint violation response.
    },
    _ => HttpResponse::BadRequest().body(ERROR_MESSAGE),
}

正如MichaelAnderson在评论中所指出的那样,

您需要将create的返回类型更改为Result<User, sqlx::postgres::PgDatabaseError>,或者不用更改create的返回类型,您可以使用anyhow::Error::downcast或其相关函数返回PgDatabaseError

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68360932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档