我尝试在Rust中使用sqlx::query!
宏将数据插入到PostgreSQL
数据库中。但是,我遇到了与uuid::Uuid
类型不满足Encode trait相关的编译错误。
错误信息:
不满足特性界限uuid::Uuid: Encode<'_, Postgres>
验证码:
use actix_web::{web, HttpResponse};
use sqlx::PgPool;
use uuid::Uuid;
use chrono::Utc;
pub async fn subscribe(form: web::Form<FormData>, connection: web::Data<PgPool>) -> HttpResponse {
sqlx::query!(
r#"
INSERT INTO subscriptions (id, email, name, subscribed_at)
VALUES ($1, $2, $3, $4)
"#,
Uuid::new_v4(),
form.email,
form.name,
Utc::now()
)
.execute(connection.get_ref())
.await;
HttpResponse::Ok().finish()
}
字符串
货物清单:
[dependencies]
actix-web = "4.4.0"
sqlx = { version = "0.7", default-features = false, features = ["runtime-tokio-rustls", "macros", "postgres", "uuid", "chrono"] }
uuid = { version = "0.8.1", features = ["v4", "serde"] }
chrono = "0.4.15"
型
尝试解决:
- 我已经确保在sqlx中启用了uuid特性。
- 我尝试了不同版本的uuid来检查兼容性。
- 我在更改Cargo.tom l后运行了cargo clean和cargo build。
是什么原因导致了这个trait绑定问题,我该如何解决?是版本不匹配,还是我错过了必要的功能激活?
更新
我用这个代码更新代码,但仍然显示错误:
use actix_web::{web, HttpResponse};
use chrono::Utc;
use sqlx::types::Uuid;
use sqlx::PgPool;
#[derive(serde::Deserialize)]
pub struct FormData {
email: String,
name: String,
}
pub async fn subscribe(form: web::Form<FormData>, connection: web::Data<PgPool>) -> HttpResponse {
let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?;
sqlx::query!(
r#"
INSERT INTO subscriptions (id, email, name, subscribed_at)
VALUES ($1, $2, $3, $4)
"#,
my_uuid,
form.email,
form.name,
Utc::now()
)
// We use `get_ref` to get an immutable reference to the `PgConnection`
// wrapped by `web::Data`.
.execute(connection.get_ref())
.await;
HttpResponse::Ok().finish()
}
型
它显示了这个错误:
let my_uuid = Uuid::parse_str("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8")?;
型?
运算符只能用在返回Result
或Option
(或实现FromResidual
的其他类型)的aprc函数中trait FromResidual<Result<Infallible, sqlx::types::uuid::Error>>
不为HttpResponse
实现
1条答案
按热度按时间kpbwa7wx1#
sqlx不知道如何序列化
Uuid
,但它知道如何序列化String
,因此您可以使用Uuid
上的to_string
方法将Uuid
转换为String
:字符串
在代码的更新版本中,您正在将
String
解析为Uuid
,这可能会失败,这就是为什么Uuid::parse
方法返回Result
,您可以解包它(如果您确定它是有效的Uuid)或像这样处理错误:型