【问题标题】:Scala slick Insert a future values from previous readsScala slick 从以前的读取中插入未来的值
【发布时间】:2016-06-21 15:18:43
【问题描述】:

我想使用从以前的数据库读取中获取的一些 id 执行数据库插入。使用 slick.codegen.SourceCodeGenerator 生成的所有 DB 对象。我有以下阅读功能:

def findByName(firstName: String, lastName: String): Future[Option[PersonsRow]] = {
    db.run(Persons.filter(person => (person.firstName === firstName && person.lastName === lastName)).result.headOption)
}

我必须执行两次这样的阅读 - 因为在我的第二张桌子上我有一个人 1 和人 2。所以最后我得到了 Future[Option[PersonsRow]] 类的 2 个对象。然后我想执行一些插入:

def createMatch(firstPerson: PersonsRow, secondPerson: PersonsRow, eventDate: java.sql.Date): Future[Long] = {
  val match = MatchesRow(id = 0, firstPersonId = firstPerson.id, secondPersonId = secondPerson.id, date = eventDate)
  db.run(Matches returning Matches.map(_.id) += match)
}

我听说处理 Future 对象的最佳方法是进一步传递该对象,而不需要任何显式等待 Future 完成。但是我想这里不可能通过 Future,我必须使用一些阻塞代码来获取这个 Future 的值。

我什至准备了一个函数:

def getFutureValue(person: Future[Option[PersonsRow]]): Option[PersonsRow] = {
  val emptyPersonsRow = PersonsRow(0, ...)  //empty person
  person onComplete {
    case Success(bsucc) => {
      return bsucc
    }
    case Failure(bfail) => {
      Logger.warn("There are problems with reading person from database: " + bfail.toString)
    }
  }
  return Some(emptyPersonsRow)
}

但它似乎不能正常工作(返回的人总是一个 emptyPersonsRow)。此外,我认为我用错了——因为这个 Future 机制是我的大敌,而不是这里的朋友 :)

有什么建议可以让我朝着正确的方向前进吗? 最好的问候

【问题讨论】:

    标签: scala slick-3.0


    【解决方案1】:

    对胜利的理解

    for {
      user1 <- findByName("John","Doe") map {_.getOrElse(throw new Error("No user 1"))}
      user2 <- findByName("Johnny","Doe") map {_.getOrElse(throw new Error("No user 2"))}
      resMatch <- createMatch(user1,user2,myEventDate)
    } yield resMatch
    

    【讨论】:

    • 我正在处理一些愚蠢的错误。记录和调试声称只有这个 for 循环的第一行被调用。所以它只调用 user1
    • 您是否单独尝试了第一行的 findByName ?您的错误表明未找到第一个用户(也就是 findByName 返回了None)。
    • 看来,即使我做一个更简单的例子: val user = for { user1
    • For 循环在涉及期货时确实要等待。你有很多关于它的问题,例如this。在你的测试中,println 没有在同一个线程上运行,因为在 user1 实际返回/更改之前执行未来。正确的测试是,在user 的定义相同的情况下,做user map prinln
    • 这让我非常困惑。每次调用都会给我不同的日志(不仅是日志顺序,还有这个日志的内容)。加载了不同的用户(并且有不同的例外声称没有这样的用户)。似乎只有在使用线程睡眠时才调用数据库插入。也许那是因为我在另一个循环中有这个 for { ... } yieldfor (event &lt;- someEvents)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2017-03-29
    • 2017-03-07
    • 2013-10-28
    • 2021-11-21
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多