我想执行一个数据库插入,其中包含从先前数据库读取中获取的一些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机制是我的大敌,而不是这里的朋友:)
有什么建议让我朝着正确的方向前进吗? 最诚挚的问候
答案 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