【发布时间】: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 机制是我的大敌,而不是这里的朋友 :)
有什么建议可以让我朝着正确的方向前进吗? 最好的问候
【问题讨论】: