pow*_*ght 10 scala doobie cats-effect
我正在尝试将项目从 cats-effect 2 迁移到 cats-effect 3,我正在使用 doobie 与数据库交互。以前我可以ConnectionIO
按照描述的IO
那样升级,但是升级后我没有找到任何实现,如何使用 CE3 实现相同的效果?LiftIO[ConnectionIO]
Dae*_*yth 10
这里有两种方法。一般来说,有“不要这样做”选项(推荐),另一种方法是使用WeakAsync
一般来说,不建议将任意内容交错IO
到ConnectionIO
程序中,因为ConnectionIO
它是事务性的,并且您无法回滚IO
. AConnectionIO
可能会运行多次,例如重试可恢复的故障。
如果可能的话,最好重构代码以不在事务内执行非事务性操作,而是在之后执行
但是,当这不切实际时,ConnectionIO
会提供一个Sync
实例,因此您可以使用它轻松执行许多操作,而无需IO
首先进行操作:
Console[ConnectionIO]
Clock[ConnectionIO]
Logger[ConnectionIO]
您可以根据需要使用适合后端的工厂创建 log4catsUUIDGen[ConnectionIO]
WeakAsync
Doobie'sWeakAsync
提供了一种获得Resource[F, F ~> ConnectionIO]
请注意,因为这是一个资源,所以您必须小心地完成其中的事务use
- 资源的生命周期FunctionK
将在完成后关闭use
。
通常这意味着这样的事情:
def doStuff(rows: List[Int]): F[Unit] = ???
WeakAsync.liftK[F, ConnectionIO].use { fk =>
val transaction = for {
rows <- sql"select 1".query[Int].to[List]
_ <- fk(doStuff(rows))
} yield ()
transaction.transact(xa)
}
Run Code Online (Sandbox Code Playgroud)