SeaOrm v1.0.0+Sqlx v0.8.0升级后Executor trait绑定错误求助
解决方法
错误原因
升级SeaOrm到1.0.0后,SeaOrm对Sqlx连接池的包装方式发生变化:sea_orm::sqlx::Pool<sea_orm::sqlx::Postgres>不再与sqlx::Pool<sqlx::Postgres>直接兼容,导致Sqlx的fetch方法无法识别SeaOrm包装后的池引用,触发trait bound不满足的错误。
方案1:改用SeaOrm原生SQL接口(推荐)
SeaOrm自带原生SQL执行能力,无需直接调用Sqlx API,可彻底避免类型兼容问题:
use sea_orm::{Statement, DatabaseBackend}; use futures::stream::StreamExt; // 获取SeaOrm连接池(无需clone,直接用引用即可) let pool = state.connection.get_postgres_connection_pool(); // 构建SQL语句,绑定参数 let stmt = Statement::from_sql_and_values( DatabaseBackend::Postgres, r#"SELECT 1"#, vec![gtin.into()] ); // 执行并获取结果流 let mut stream = pool.fetch_stream(stmt); // 遍历结果并转换为自定义结构体 while let Some(result) = stream.next().await { let row = result?; let data: SearchGtinData = row.into(); // 处理data逻辑 }
如果需要自动映射结构体,可实现SeaOrm的FromQueryResult trait简化转换:
use sea_orm::FromQueryResult; #[derive(Debug, FromQueryResult)] struct SearchGtinData { // 字段需与查询结果列名一一对应 some_column: i32, } // 直接查询并映射到结构体 let data = SearchGtinData::find_by_statement(stmt).one(pool).await?;
方案2:保留Sqlx API,获取内部连接池引用
如果必须继续使用Sqlx的query_as,可通过解引用SeaOrm池获取内部的Sqlx池引用:
let conn = state.connection.get_postgres_connection_pool().clone(); let mut stream = sqlx::query_as::<_, SearchGtinData>( r#"SELECT 1"#, ) .bind(gtin) .fetch(&*conn); // 通过&*conn解引用到原生sqlx::Pool<sqlx::Postgres>
若SeaOrm池提供inner()方法(可查阅SeaOrm 1.0文档确认),也可直接调用该方法获取内部池:
.fetch(conn.inner());
内容的提问来源于stack exchange,提问作者Nkk
相关产品推荐
相关产品推荐

