问题:如何在 rust-postgres client.execute 调用中使用用户定义的类型

我有以下代码用于在表中插入电子邮件地址。

fn add(&mut self, email: &str) {
  match self.client.execute("call email_add($1)", &[&email]) {
    Ok(_) => {
      println!("inserted")
    }
    Err(e) => {
      println!("{:?}", e);
    }
  }
}

测试代码时出现此错误:

Error { kind: ToSql(0), cause: Some(WrongType { postgres: Other(Other { name: "email_address", oid: 37434, kind: Domain(Text), schema: "public" }), rust: "&str" }) }

电子邮件地址用户定义类型定义为:

-- http://www.regular-expressions.info/email.html
create domain email_address
  text not null
  constraint chk_email
  check(
    length(value) < 254
    and
    value ~ '^[a-zA-Z0-9._%+-]{1,64}@(?:[a-zA-Z0-9-]{1,63}\.){1,125}[a-zA-Z]{2,63}$'
 );

我正在使用 rust-postgres 板条箱。

解答

我必须为我创建的email_address域实现postgres_types::ToSql特征。

struct EmailAddress {
  email: String
}

impl ToSql for EmailAddress {
  fn to_sql(&self, ty: &Type, out: &mu BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
    return self.email.to_sql(ty, out);
  }
  
  to_sql_checked!();

  fn accepts(ty: &Type) -> bool {
    return ty.name() == "email_address";
  }
}

然后我将添加功能更改为:

fn add(&mut self, email: &str) {
  let email_address: EmailAddress = EmailAddress {
    email: String::from(email)
  }
  match self.client.execute("call email_add($1)", &[&email_address]) {
    Ok(_) => {
      println!("inserted")
    }
    Err(e) => {
      println!("{:?}", e);
    }
  }
}
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐