如何修复Rocket框架中‘无法找到derive宏FromRow’的编译报错?
问题:Rocket框架连接PostgreSQL时,FromRow derive宏报错
我的Cargo.toml配置:
[package] name = "TestRust" version = "0.1.0" edition = "2021" [dependencies] rand = "0.8.3" rocket = { version = "=0.5.0-rc.3", features = ["secrets"] } serde = { version = "1", features = ["derive"] } [dependencies.rocket_dyn_templates] version = "=0.1.0-rc.3" features = ["handlebars", "tera"] [dependencies.rocket_db_pools] version = "=0.1.0-rc.3" features = ["sqlx_postgres"] [default.databases.ecom] url="postgresql://localhost:5432/default?user=postgres&password=test"
main.rs代码:
#[macro_use] extern crate rocket; use rocket::fs::{FileServer, relative}; use rocket::futures::{FutureExt, TryFutureExt}; use serde::{Deserialize, Serialize}; use rocket_db_pools::{Connection, Database}; use rocket_dyn_templates::{Template, context}; use rocket_db_pools::sqlx::{self, Row}; use sqlx::FromRow; #[derive(Database)] #[database("ecom")] struct Logs(sqlx::PgPool); #[derive(Deserialize, Serialize, FromRow)] #[serde(crate = "rocket::serde")] pub struct Produit { //#[serde(skip_deserializing, skip_serializing_if = "Option::is_none")] id: Option<i64>, name: String, fk_categorie: String, }
编译时报错:
error: cannot find derive macro `FromRow` in this scope --> src\main.rs:14:34 | 14 | #[derive(Deserialize, Serialize, FromRow)] | ^^^^^^^ | note: `FromRow` is imported here, but it is only a trait, without a derive macro --> src\main.rs:9:5 | 9 | use sqlx::FromRow; | ^^^^^^^^^^^^^
尝试修改serde版本无效,请问如何解决?
解决方法
这个错误的核心原因是:sqlx::FromRow默认只是一个trait,并没有自带derive宏,要使用#[derive(FromRow)]必须先开启sqlx的derive特性,同时确保宏在作用域内。
步骤1:启用sqlx的derive特性
修改Cargo.toml中rocket_db_pools的依赖配置,添加sqlx/derive特性,让sqlx生成derive宏:
[dependencies.rocket_db_pools] version = "=0.1.0-rc.3" features = ["sqlx_postgres", "sqlx/derive"]
步骤2:确保FromRow宏在作用域内
有两种方式可以解决宏的作用域问题:
- 方式一:使用全路径指定derive宏
直接在derive属性中写sqlx::FromRow,无需额外导入宏:
#[derive(Deserialize, Serialize, sqlx::FromRow)] #[serde(crate = "rocket::serde")] pub struct Produit { id: Option<i64>, name: String, fk_categorie: String, }
- 方式二:显式导入FromRow宏
在main.rs中同时导入FromRowtrait和对应的宏:
use sqlx::FromRow; // 导入trait use sqlx::derive::FromRow; // 导入derive宏
额外注意事项
确保Produit结构体的字段名称和数据库表中的字段完全匹配(PostgreSQL默认使用小写蛇形命名,比如fk_categorie对应表中的fk_categorie字段),如果字段名不匹配,可以用#[sqlx(rename = "数据库字段名")]属性调整,例如:
#[derive(Deserialize, Serialize, sqlx::FromRow)] #[serde(crate = "rocket::serde")] pub struct Produit { #[sqlx(rename = "product_id")] id: Option<i64>, name: String, #[sqlx(rename = "category_id")] fk_categorie: String, }
内容的提问来源于stack exchange,提问作者macyaz
相关产品推荐
相关产品推荐

