二进制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
相关产品推荐
相关产品推荐

