相关疑难解决方法(0)

Doobie和DB访问组合在1个事务中

Doobie的书说,从存储库层返回ConnectionIO是一个很好的做法.它提供了链接调用并在一个事务中执行它们的能力.很好,很清楚.

现在让我们假设我们正在开发REST API服务,我们的场景是:

  1. 在数据库中查找对象
  2. 使用此对象执行一些异步操作(使用cats.effect.IO或monix.eval.Task).
  3. 将对象存储在数据库中.

我们希望在1个事务中执行所有这些步骤.问题是没有自然变换,我们transactor.trans()在2 monad工作 - TaskConnectionIO.那是不可能的.

问题是 - 如何将doobie ConnectionIO与1个组合中的任何效果monad 混合,例如我们在1个事务中工作并且能够在世界末尾提交/回滚所有数据库突变?

谢谢!

UPD:小例子

def getObject: ConnectionIO[Request]                      = ???
def saveObject(obj: Request): ConnectionIO[Request]       = ???
def processObject(obj: Request): monix.eval.Task[Request] = ???

val transaction:??? = for {
    obj       <- getObject             //ConnectionIO[Request]
    processed <- processObject(obj)    //monix.eval.Task[Request]
    updated   <- saveObject(processed) //ConnectionIO[Request]
  } yield updated
Run Code Online (Sandbox Code Playgroud)

UPD2:@ oleg-pyzhcov提供的正确答案是将效果数据类型提升到ConnectionIO这样:

def getObject: ConnectionIO[Request]                      = ???
def saveObject(obj: Request): ConnectionIO[Request]       = ???
def processObject(obj: Request): monix.eval.Task[Request] …
Run Code Online (Sandbox Code Playgroud)

scala scala-cats doobie

10
推荐指数
1
解决办法
1365
查看次数

如何使用 doobie 对 Scala 中的 PostgreSQL 数据库执行字符串 SQL 语句列表?

我正在将以下 10 行 Python 代码移植到 Scala:

import psycopg2

def execute(user, password, database, host, port, *queries):
    connection = psycopg2.connect(user=user, password=password, host=host, port=port, database=database)
    cursor = connection.cursor()
    for sql in queries:
        print(sql)
        cursor.execute(sql)
    connection.commit()
    cursor.close()
    connection.close()
Run Code Online (Sandbox Code Playgroud)

我有以下等效的 Scala 代码:

def execute(user: String, password: String, database: String, host: String, port: Int, queries: String*): Unit = {
  ???
}    
Run Code Online (Sandbox Code Playgroud)

我想在针对数据库的单个事务中执行(并打印)一堆 SQL 语句(假设它是 Postgres)并完成。

我如何使用doobie做到这一点

笔记:

  1. 我无法将接口更改为我的execute()(包括我无法添加类型或隐式参数)。它必须接受字符串用户、密码等和一个可变参数,queries: String*从而保持与 Python 相同的接口。

  2. 还请提及所有需要的进口

scala doobie

7
推荐指数
1
解决办法
1283
查看次数

标签 统计

doobie ×2

scala ×2

scala-cats ×1