如何在 rust-postgres client.execute 调用中使用用户定义的类型
·
问题:如何在 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);
}
}
}
更多推荐
所有评论(0)