我有这个基于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)
答案 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)
}
}