Rust用Diesel查询PostgreSQL时出现E0277 trait绑定错误
解决Diesel中E0277类型兼容错误
问题场景
使用Rust构建GraphQL API时,通过Diesel查询PostgreSQL数据库,调用load::<User>方法编译时触发E0277错误,提示数据库返回类型与User结构体不兼容。
错误信息
error[E0277]: the trait bound `(Integer, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Nullable<diesel::sql_types::Bool>, diesel::sql_types::Nullable<diesel::sql_types::Bool>): load_dsl::private::CompatibleType<User, Pg>` is not satisfied --> src\resolvers\users_resolver.rs:11:23 | 11 | .load::<User>(connection) | ---- ^^^^^^^^^^ the trait `load_dsl::private::CompatibleType<User, Pg>` is not implemented for `(Integer, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Nullable<diesel::sql_types::Bool>, diesel::sql_types::Nullable<diesel::sql_types::Bool>)` | | | required by a bound introduced by this call | = help: the following other types implement trait `load_dsl::private::CompatibleType<U, DB>`: (ST0, ST1) (ST0, ST1, ST2) (ST0, ST1, ST2, ST3) (ST0, ST1, ST2, ST3, ST4) (ST0, ST1, ST2, ST3, ST4, ST5) (ST0, ST1, ST2, ST3, ST4, ST5, ST6) (ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7) (ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8) and 24 others = note: required for `SelectStatement<FromClause<table>, DefaultSelectClause<FromClause<table>>, NoDistinctClause, ..., ..., ...>` to implement `LoadQuery<'_, _, User>` = note: the full type name has been written to 'D:\Documents\chat\server\target\debug\deps\server.long-type-9800167139566061747.txt' note: required by a bound in `diesel::RunQueryDsl::load` --> C:\Users\cooke\.cargo\registry\src\github.com-1ecc6299db9ec823\diesel-2.0.4\src\query_dsl\mod.rs:1499:15 | 1499 | Self: LoadQuery<'query, Conn, U>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `RunQueryDsl::load`
触发错误的查询函数
pub fn get_users() -> Vec<User> { use crate::schema::users::dsl::*; let connection = &mut establish_connection(); let results = users .limit(5) .load::<User>(connection) .expect("Error loading posts"); results }
User模型定义
#[derive(Queryable)] pub struct User { pub id: i32, pub first_name: String, pub last_name: String, pub email: String, pub password: String, pub phone: String, pub active: bool, pub superuser: bool, }
解决方案
1. 匹配数据库字段可空性
错误提示显示数据库返回的active和superuser字段是Nullable<Bool>类型,但User模型中定义为非空bool,导致类型不兼容:
- 如果数据库中这两个字段确实允许为NULL,修改
User模型对应字段为Option<bool>:#[derive(Queryable)] pub struct User { pub id: i32, pub first_name: String, pub last_name: String, pub email: String, pub password: String, pub phone: String, pub active: Option<bool>, pub superuser: Option<bool>, } - 如果数据库中这两个字段不允许为NULL,检查
src/schema.rs文件中对应的字段定义,确保是Bool而非Nullable<Bool>。若schema文件与数据库结构不一致,重新生成schema:diesel print-schema > src/schema.rs
2. 确认派生宏依赖
确保User结构体所在文件已正确导入Queryable trait:
use diesel::Queryable;
内容的提问来源于stack exchange,提问作者Isaac Cooke
相关产品推荐
相关产品推荐

