You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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中同时导入FromRow trait和对应的宏:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:47:34