将带有 DynSession 块的多语句 Slick 2.1 更新为 Slick 3.0.3

Update a multi-statement Slick 2.1 withDynSession block to Slick 3.0.3

我有这个基于 Slick 2.1 的回购方法:

def addContentBySourceInfo(userId: UUID, adopted: Boolean, contentId: UUID, contentInfo: ContentWithoutId): Either[ContentAlreadyExistsError, Content] = {

  getDatabase withDynSession {
    val content = contentInfo.toContent(contentId)

    Try {
      ContentTable.query += content
      UserContentTable.query += UserContentModel(userId, contentId, Some(adopted))
    } match {
      case Failure(e:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException) =>
        Left(ContentAlreadyExistsError(content.source, content.sourceId))
      case Failure(e) => throw e // could be some other error, and we should fail fast.
      case Success(s) => Right(content)
    }
  }
}

其中 getDatabase 只是 returns Database.forURL(..) 来自 slick.jdbc.JdbcBackend.

我如何将其转换为与 Slick 3.x 的 DBIO api 兼容?

注意:我想保持这些方法同步,直到我准备好升级我的整个存储库层以处理异步调用(即我不想中断我的存储库 API 刚刚)

你应该尝试这样的事情:

def addContentBySourceInfo(userId: UUID, adopted: Boolean, contentId: UUID, contentInfo: ContentWithoutId): Either[ContentAlreadyExistsError, Content] = {
  val content = contentInfo.toContent(contentId)
  val actions = DBIO.seq(
    ContentTable.query     += content,
    UserContentTable.query += UserContentModel(userId, contentId, Some(adopted))
  )

  Try(Await.result(db.run(actions), Duration.Inf)) match {
    case Failure(e:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException) =>
      Left(ContentAlreadyExistsError(content.source, content.sourceId))
    case Failure(e) => throw e
    case Success(s) => Right(content)
  }
}