【问题标题】:Slick 3.0.0 - multiple inserts depending on each other with return valueSlick 3.0.0 - 多个插入相互依赖并返回值
【发布时间】:2015-06-11 11:49:38
【问题描述】:

我正在尝试更新到 Slick 3.0.0(反应式 Slick),但是我无法让最基本的东西正常工作。在我可以做类似db.withTransaction { ... } 的事情之前它会运行,但是我什至无法编译:

def insertNewFacebookUser(
  facebookId: String,
  email: String,
  firstName: String,
  lastName: String
) = {
  val user =
  (Users.map(u ⇒ (u.email, u.firstName, u.lastName)) returning Users) +=
    ((email, firstName, lastName))

  FacebookAuths.map(f ⇒ (f.userId, f.facebookId)) += ((user.id, facebookId))

  user
}

这只是抱怨user.id 被包裹在一些DBIOAction 中,我应该如何编写它才能编译?

谢谢

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    在不了解架构的情况下:

    def insertNewFacebookUser(
      facebookId: String,
      email: String,
      firstName: String,
      lastName: String
    ): DBIOAction[???, ???, ???] = for {
          userId <- Users returning Users.map(_.id) += (email, firstName, lastName)
           _     <- FacebookAuths += (userId, facebookId)
        } yield (User(userId, email, firstName, lastName))
    
    val user: Future[User] = db.run(insertNewFaceBookUser(....)
    

    我不确定返回的 DBIOAction 的确切类型是什么,因为它取决于您的架构,因此是 ???。一切都包含在某种操作中,因此当您尝试直接在 FacebookAuths 的插入中使用 userId 时,它是错误的类型。相反,您想要做的是在返回的结果上map/flatMap 并编写更完整的操作。 for {...} yield 只是 mapflatMap 上的糖。然后您 run 您的操作以获得您的结果的 Future。然后,您可以根据需要map

    【讨论】:

    • 感谢您的好回答!现在我更了解如何使用它。谢谢
    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2017-08-06
    相关资源
    最近更新 更多