postgresql - 我无法捕获数据库引用

标签 postgresql rust actix-web rust-sqlx

我正在尝试使用带有Postgresql的Actix-web,async-grahpql和sqlx创建一个API
在async-graphql的QueryRoot中,我试图捕获数据库的引用,并使用sqlx对数据库进行查询,但这给了我一个错误

 let items = Todo::list(&pool).await?;
   |                                ^^^^^ expected struct `sqlx::Pool`, found enum `std::result::Result`
在这里我想获取引用
use crate::todo::*;
use async_graphql::{Context, FieldResult};
use sqlx::postgres::PgPool;

pub struct QueryRoot;

#[async_graphql::Object]
impl QueryRoot {
    async fn todos(&self, ctx: &Context<'_>) -> FieldResult<Vec<Todo>> {
        let pool = ctx.data::<PgPool>();
        let items = Todo::list(&pool).await?; //<-- This line generates an error
 
        Ok(items)
    }
}
在这里我定义了引用
pub fn run(listener: TcpListener, db_pool: PgPool) -> Result<Server, std::io::Error> {

    let data_db_pool = Data::new(db_pool);

    //GraphQL
    let schema = Schema::build(QueryRoot, MutationRoot, EmptySubscription)
        .data(data_db_pool.clone()) //<- DB reference
        .finish();

    let server = HttpServer::new(move || {
        App::new()
            .app_data(db_pool.clone()) //<- DB reference
            .data(schema.clone())
            .route("/graphql", web::post().to(graphql))
            .route("/graphql", web::get().to(graphql_playground))
    })
    .listen(listener)?
    .run();
    Ok(server)
}
我究竟做错了什么?完整的代码可以在here中找到。

最佳答案

ctx.data::<T>() 返回包装了对Result的引用的T。您可能想要。

let pool = ctx.data::<PgPool>()?;
                            // ^ return on Err, otherwise yield the &PgPool
let items = Todo::list(pool).await?;
                    // ^^^^ shouldn't need & here

关于postgresql - 我无法捕获数据库引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64409592/

相关文章:

postgresql - postgres - 估计时间戳列的索引大小

用于 Postgres 的 php pdo : "could not find driver"

rust - 如何在稳定的 Rust 中同步返回在异步 Future 中计算的值?

rust - 从 Tokio Core 导入 channel 模块失败

rust - 如何用actix-web的Json类型解析 "implementation of serde::Deserialize is not general enough"?

rust - 从Actix Web处理程序返回HTML或JSON

php - pg_free_result() 是否必要,即使结果超出范围?

sql - PostgreSQL:将 SQL 查询简化为更短的查询

rust - 有没有办法部分解构结构?

asynchronous - 从 Tokio 应用程序使用 Actix:混合 actix_web::main 和 tokio::main?