将多语句Slick 2.1 withDynSession块更新为Slick 3.0.3

时间:2016-07-20 16:02:00

标签: scala slick-3.0

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

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只是从Database.forURL(..)返回slick.jdbc.JdbcBackend

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

注意:我希望将这些方法保持同步,直到我准备升级整个存储库层来处理异步调用(即我不想暂停我的存储库API)

1 个答案:

答案 0 :(得分:1)

你应该尝试这样的事情:

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)
  }
}