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

二进制crate用deadpool-postgres时如何向用postgres的库传递Client

解决方案

你从deadpool-postgres连接池调用get()方法拿到的是deadpool_postgres::Client智能指针对象,它对底层的数据库客户端做了封装,针对你的场景有两种处理方案:

方案1:可修改库crate定义(推荐)

直接修改库crate中Data结构体的字段类型,改为持有deadpool_postgres::Client即可,该类型实现了Deref<Target = postgres::Client>,可以直接调用所有postgres::Client的方法,同时连接使用完后会自动归还到连接池,不需要手动管理生命周期。
修改后的代码示例:

// 库crate代码
use deadpool_postgres::Client as DbClient;

struct Data {
  client: DbClient
}

二进制crate无需额外修改,直接传递即可:

let client = pool.get().await.unwrap();
let data = Data { client };

方案2:不可修改库crate定义,必须拿到postgres::Client所有权

调用deadpool_postgres::Client的take()方法,即可取出底层的postgres::Client实例,该操作会让当前连接脱离连接池的管理,后续不会自动归还,需要你手动管理连接的关闭逻辑。
代码示例:

let pool_client = pool.get().await.unwrap();
// 取出底层postgres::Client,返回Result,出错代表连接已经被取出过
let pg_client = pool_client.take().unwrap();
let data = Data { client: pg_client };

注意事项

如果出现类型不匹配报错,检查你的deadpool-postgres依赖是否开启了sync特性:默认的deadpool-postgres基于异步的tokio-postgres实现,只有开启sync特性后,底层客户端类型才会和同步的postgres::Client一致。

内容的提问来源于stack exchange,提问作者ferd tomale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:09:03