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 上下文中运行这两种效果。 我知道使用 F 的连接 [IO[]] 时的解决方案。 但是,如果可能的话,需要一个解决方案,同时保留在通用的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
}

相关内容

  • 没有找到相关文章

最新更新