【问题标题】:Slick DBIO to Future[Either[Error, User]]Slick DBIO 到未来[Either[Error, User]]
【发布时间】:2019-04-03 23:15:16
【问题描述】:

我是 Slick 的新手,遇到以下问题。 我正在尝试实现这里定义的方法createUser

def createUser(data: UserCreate): Future[User] = {
   val userRow = User(userId = UUID.randomUUID(),
     email = data.email, password = data.password,
     firstName = data.firstName, lastName = data.lastName, balance = 0)
   val userAction =
     Users
       .filter(_.email === data.email).result.headOption.flatMap {
       case Some(res) =>
         //          mylog("product was there: " + product)
           DBIO.successful(res)
       case None =>
         //          mylog("inserting product")
         (Users returning Users.map(_.id) into (
           (user, newId) => user.copy(id = Some(newId)))
           ) += userRow
     }
       .transactionally
   db.run(userAction)
}

问题是如果用户已经存在我想给出一个错误,所以方法的签名应该是

def createUser(data: UserCreate): Future[Either[RecordAlreadyExists, User]]

您知道我该怎么做吗?没有引发 Throwable?

【问题讨论】:

    标签: scala sbt slick slick-3.0


    【解决方案1】:

    恕我直言,这是一个转换 Futures 的案例,而不是一个关于 slick 的问题。

    这样的事情怎么样:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    import scala.concurrent.Future
    import scala.util.{Failure, Success}
    import scala.concurrent.ExecutionContext.Implicits.global
    
    case object RecordAlreadyExists extends RuntimeException
    
    case class User(id: Int)
    
    Future[User](throw new RuntimeException).
      transformWith {
      case Success(user) => Future.successful(Right[RecordAlreadyExists.type, User](user))
      case Failure(_) => Future.successful(Left[RecordAlreadyExists.type, User](RecordAlreadyExists))
    }
    
    
    // Exiting paste mode, now interpreting.
    
    import scala.concurrent.Future
    import scala.util.{Failure, Success}
    import scala.concurrent.ExecutionContext.Implicits.global
    defined object RecordAlreadyExists
    defined class User
    res3: scala.concurrent.Future[scala.util.Either[RecordAlreadyExists.type,User]] = Future(<not completed>)
    

    您可以匹配表示“用户已存在”的特定数据库异常,而不是我所拥有的全部内容

    注意: 在我的示例中,Future[User](throw new RuntimeException) 代表问题中指定的完整功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多