Scala slick插入先前读取的未来值

时间:2016-06-21 15:18:43

标签: scala slick-3.0

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

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

我必须两次执行这样的阅读 - 因为在我的第二个表中我有一个person1和person2。所以最后我得到了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)
}

但它似乎没有正常工作(返回的人总是一个空的PersonsRow)。此外我相信我错了 - 因为这个Future机制是我的大敌,而不是这里的朋友:)

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

1 个答案:

答案 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