postgresql - Doobie 在通用上下文 F 的事务中运行多个效果 f1 和 f2?
问题描述
我想运行两个效果 f1 和 f2 更新两个不同的数据库表 t1 和 t2,同时保持在通用 F 上下文中。
def update(model:Details): Update0 = sql"""Update details_compta
set TRANSID=${model.transid}, ACCOUNT=${model.account}, SIDE=${model.side}, OACCOUNT=${model.oaccount},
AMOUNT=${model.amount}, DUEDATE=${model.duedate}, TEXT=${model.text}, CURRENCY=${model.currency}, COMPANY=${model.company}
where id =${model.id}""".update
}
def update(model: FinancialsTransaction): Update0 = sql"""Update master_compta
set OID=${model.oid}, COSTCENTER=${model.costcenter}, ACCOUNT=${model.account}, TRANSDATE=${model.transdate}
, HEADERTEXT=${model.text}, FILE_CONTENT=${model.file_content}, TYPE_JOURNAL=${model.typeJournal}
, PERIOD=${model.period}
where id =${model.tid} AND POSTED=false""".update
}
我尝试了以下无法编译的方法:
def update(model: FinancialsTransaction): F[Int] = {
val l1 = model.lines.map(SQL.FinancialsTransactionDetailsRepo.update(_)) :+ SQL.FinancialsTransactionRepo.update(
model
)
l1.sequence.run.transact(transactor)
我收到以下错误:
doobie/DoobieRepository.scala:892:8: Cannot prove that doobie.util.update.Update0 <:< G[A].[error] l1.sequence.run.transact(transactor)
PS:我想在单个事务和通用 F 上下文中运行这两种效果。我知道将 Connection[IO[]] 用于 F 时的解决方案。但如果可能的话,需要一个解决方案,同时保留在通用 F 上下文中。谢谢
解决方案
我通过引入辅助函数/方法解决了
def getX[A](func: A => Update0, query: A):
ConnectionIO[Int] =
for {
response <- func(query).run
} yield response
def getXX[A](func: List[A] => List[Update0], query:
List[A]):
List[ConnectionIO[Int]] =
for {
response <- func(query).map(_.run)
} yield response
}
使用这些功能我可以实现更新
def update(model: FinancialsTransaction): F[List[Int]] =
{
val result: List[ConnectionIO[Int]] =
getXX(SQL.FinancialsTransactionDetails.update, oldLines)
++List(getX(SQL.FinancialsTransaction.update, model))
result.sequence.transact(transactor)
}
其中 SQL.FinancialsTransactionDetails.update 和 SQL.FinancialsTransaction.update 也是获取 SQL 更新语句并分别为单个和多个语句生成 Update0 的函数
def update(model: FinancialsTransactionDetails): Update0
= sql"""Update details_compta
set ACCOUNT=${model.account}, SIDE=${model.side},
OACCOUNT=${model.oaccount},
AMOUNT=${model.amount}, DUEDATE=${model.duedate},
TEXT=${model.text}, CURRENCY=${model.currency}
where id =${model.lid} """.update
}
override def update(model: FinancialsTransaction):
Update0 = sql"""Update master_compta
set OID=${model.oid}, COSTCENTER=${model.costcenter},
ACCOUNT=${model.account},
TRANSDATE=${model.transdate},
, HEADERTEXT=${model.text},
FILE_CONTENT=${model.file_content},
TYPE_JOURNAL=${model.typeJournal}
, PERIOD=${model.period}
where id =${model.tid} AND POSTED=false""".update
}
推荐阅读
- php-curl - 如何将 Curl 转换为 PHP CURL
- gdb-python - gdb python disas - 解析输出
- ios - Cordova-plugin-firebase:无法在 iOS 12.2 上运行,但在 android 和 iOS 10.3.3 上运行没有任何问题
- android - 查询firebase数据库以比较数据
- php - 如何在共享主机(子域)上部署流明框架
- python - 如何在具有固定索引号的熊猫数据框中填充 0?
- sql - 如何找到每个地区最大订购量的产品?
- java - 使用 Lettuce 的 Spring Boot StringRedisTemplate 错误(Redis 命令超时)
- laravel - 什么最适合 Laravel 登录?
- java - 如何在 JBoss EAP 7.1 中排除 jackson 库而不排除 resteasy