Doobie - 将任意效果提升到 ConnectionIO CE3

pow*_*ght 10 scala doobie cats-effect

我正在尝试将项目从 cats-effect 2 迁移到 cats-effect 3,我正在使用 doobie 与数据库交互。以前我可以ConnectionIO按照描述的IO那样升级,但是升级后我没有找到任何实现,如何使用 CE3 实现相同的效果?LiftIO[ConnectionIO]

Dae*_*yth 10

这里有两种方法。一般来说,有“不要这样做”选项(推荐),另一种方法是使用WeakAsync

“别那样做”

一般来说,不建议将任意内容交错IOConnectionIO程序中,因为ConnectionIO它是事务性的,并且您无法回滚IO. AConnectionIO可能会运行多次,例如重试可恢复的故障。

如果可能的话,最好重构代码以不在事务内执行非事务性操作,而是在之后执行

但是,当这不切实际时,ConnectionIO会提供一个Sync实例,因此您可以使用它轻松执行许多操作,而无需IO首先进行操作:

  • 可以通过调用来打印到控制台Console[ConnectionIO]
  • 获取当前时间可以通过Clock[ConnectionIO]
  • Logger[ConnectionIO]您可以根据需要使用适合后端的工厂创建 log4cats
  • 可以通过以下方式生成 UUID 值UUIDGen[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)